未解决的外部符号!

遗忘功能体
许多新的程序员的一个问题是:如果我们向前声明一个函数,但不定义它会发生什么?
答案是:这取决于。如果一个正向声明,但函数永远不会调用,程序将编译并运行好。但是,如果一个前向声明,该函数被调用,但该程序从来没有定义的功能,程序将编译好,但链接器会抱怨,它不能解决函数调用。

考虑下面的程序:

#include <iostream>
 
int add(int x, int y); // forward declaration of add() using function prototype
 
int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}

在这个程序中,我们提出声明(),我们称之为(),但我们没有任何定义()。当我们尝试编译这个程序时,视觉工作室2005快车产生如下信息:
编译…
add.cpp
链接…
add.obj:错误LNK2001:未解决的外部符号”(int,int,int __cdecl添加)”(?添加@ @ yahhh @ Z)
add.exe:致命错误lnk1120:1未解决的疑团
你可以看到,程序编译好的,但是它没有在链接阶段(int,int,int加)没有定义。
其他类型的前向声明
前向声明是最常用的函数。然而,前向声明也适用于C++的其他标识符,如变量和用户自定义类型。其他类型的标识符(例如,用户定义类型)有不同的前向声明的语法。
我们将讨论更多关于如何在未来的经验中声明其他类型的标识符。
声明和定义
在C++中,你经常会听到“宣言”和“定义”。他们的意思是什么?你现在有足够的一个框架,以了解两者之间的差异。
定义实际实现或实例化(导致内存被分配的标识符)。下面是一些定义的例子:

在Keil编译器中,出现“未解决外部符号”(Unresolved External Symbol)错误通常表示链接器在尝试解析某个符号(例如函数名或全局变量)时未能找到其定义。此类错误在嵌入式开发中较为常见,尤其是在项目依赖关系复杂或配置不当的情况下。 ### 原因分析 1. **未定义的函数或变量** 如果代码中引用了某个函数或全局变量,但在任何源文件中都没有定义该函数或变量,则链接器将报告未解决外部符号错误。 2. **拼写错误或大小写不一致** 函数名或变量名的拼写错误,或者在声明与定义时使用了不同的大小写形式,也可能导致链接失败。 3. **未正确包含实现文件** 如果引用的函数或变量定义在另一个源文件中,但该文件未被添加到项目中,链接器将无法找到其定义。 4. **静态库未正确链接** 当项目依赖于外部静态库(.lib 或 .a 文件)时,若库文件未被正确链接,或库中未包含所需的符号定义,也会导致此类错误。 5. **目标文件未被正确生成或链接** 若某些源文件未成功编译为目标文件(.o 或 .obj),或目标文件未被包含在链接阶段,则相应的符号将无法解析。 6. **编译器优化或符号导出问题** 某些编译器优化设置可能导致未使用的符号被移除,或者在使用DLL时未正确导出符号。 ### 解决方法 1. **检查函数或变量定义** 确保所有引用的函数和变量在某个源文件中都有定义,并且拼写和大小写完全一致。 2. **确认源文件已添加到项目中** 在Keil项目中检查所有包含函数定义的源文件是否已被正确添加,并确保其参与编译过程。 3. **验证库文件链接** 若使用了外部库文件,确认其路径已正确配置,并在项目设置中将其添加到链接器输入中。 4. **检查目标文件生成情况** 查看编译输出日志,确认所有源文件均成功生成目标文件,并确保链接器包含这些目标文件。 5. **避免编译器优化问题** 若怀疑编译器优化导致符号被移除,可尝试关闭优化选项或使用特定编译器指令保留关键符号。 6. **清理并重新构建项目** 有时旧的目标文件可能造成链接冲突,执行“Clean Project”后重新构建整个项目可排除此类问题。 7. **查看链接器映射文件** 启用链接器生成映射文件功能,检查未解析符号的详细信息,有助于定位问题来源。 ### 示例代码:符号未定义导致错误 ```c // main.c extern void myFunction(void); // 声明但未定义 int main(void) { myFunction(); // 链接时将报告未解决外部符号 return 0; } ``` 在上述示例中,`myFunction`仅被声明而未定义,链接器将报告其为未解决外部符号。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值