一、是什么?
在编译程序时,出现了“unresolved externals”错误,这是什么意思呢?简单来说,这个错误是指程序在编译时找不到一些在程序中被引用但并未在当前文件或库中找到的函数或变量。这些函数或变量通常位于外部文件或库中。
这个错误通常会在链接阶段发生。在链接阶段,编译器会将所有的目标文件和库链接在一起,以创建最终的可执行文件。在这个过程中,编译器会检查所有的符号,例如函数或变量,以确保它们都能够被正确地解析。
然而,如果遇到了未能解析的函数或变量,编译器就会报告一个“unresolved externals”错误。
二、为什么会出现unresolved externals?
那么为什么会出现这个错误呢?通常有以下几个原因:
1.函数或变量未定义
如果在程序中引用了一个函数或变量,但是这个函数或变量在任何库中都没有被定义,那么编译器就无法找到它们,从而导致“unresolved externals”错误。
2.链接库未正确链接
如果程序依赖于某些外部库,但是这些库未能正确链接,编译器就无法找到程序中需要的符号,导致“unresolved externals”错误。
3.函数或变量名称错误
如果在程序中引用了一个函数或变量,但是在程序中使用的名称与定义时使用的名称不一致,编译器就会找不到这个符号,导致“unresolved externals”错误。
4.编译器的链接顺序不正确
如果程序中的多个目标文件包含相同的全局变量或函数,但是编译器将它们的链接顺序安排不当,就会导致“unresolved externals”错误。
三、如何解决unresolved externals?
为了解决“unresolved externals”错误,我们可以采取以下几步:
1.检查函数或变量是否被正确定义
如果程序中引用了一个函数或变量,但是这个函数或变量在任何库中都没有被定义,那么编译器就会找不到这个符号,从而导致“unresolved externals”错误。因此,我们需要检查这个函数或变量是否被正确定义。
//示例代码 #include using namespace std; //函数未定义 void foo(); int main() { foo(); return 0; }
上述代码中的函数foo()在程序中被引用,但是并没有被定义,因此编译器就会报告“unresolved externals”错误。为了解决这个问题,我们需要在程序的某个地方定义这个函数:
//示例代码 #include using namespace std; //函数已定义 void foo() { cout<<"Hello world!"<<endl; } int main() { foo(); return 0; }
2.检查库是否正确链接
如果程序依赖于某些外部库,但是这些库未能正确链接,编译器就会无法找到程序中需要的符号,导致“unresolved externals”错误。为了解决这个问题,我们需要检查库是否正确链接。
//示例代码 #include #include int main() { double result=sqrt(4.0); std::cout<<"The result is "<<result<<std::endl; return 0; }
上述代码中使用了math.h头文件中的sqrt()函数,如果编译器无法找到这个函数,就会报告“unresolved externals”错误。为了解决这个问题,我们需要在编译器的链接选项中添加对math库的链接:
//示例代码 gcc main.cpp -lm
3.检查函数或变量名称是否正确
如果在程序中引用了一个函数或变量,但是在程序中使用的名称与定义时使用的名称不一致,编译器就会找不到这个符号,导致“unresolved externals”错误。为了解决这个问题,我们需要检查函数或变量名称是否正确。
//示例代码 #include //定义变量 int my_var=10; int main() { //使用未定义的变量名 std::cout<<myvar<<std::endl; return 0; }
上述代码中输出变量myvar,但实际上程序中定义的变量名是my_var,这就会导致编译器找不到这个符号,报告“unresolved externals”错误。为了解决这个问题,我们需要使用正确的变量名:
//示例代码 #include //定义变量 int my_var=10; int main() { //使用正确的变量名 std::cout<<my_var<<std::endl; return 0; }
4.调整编译器的链接顺序
如果程序中的多个目标文件包含相同的全局变量或函数,但是编译器将它们的链接顺序安排不当,就会导致“unresolved externals”错误。为了解决这个问题,我们可以试着调整编译器的链接顺序。
//示例代码 //test1.cpp #include //定义全局变量 int global_var=10; //test2.cpp #include //引用全局变量 extern int global_var; int main() { std::cout<<"The global variable is "<<global_var<<std::endl; return 0; }
上述代码中,目标文件test1.cpp中定义了一个全局变量global_var,目标文件test2.cpp中引用了这个全局变量。如果编译时顺序不正确,就会导致编译器无法正确解析global_var符号,报告“unresolved externals”错误。为了解决这个问题,在编译时需要将test1.cpp放在test2.cpp之前:
//示例代码 gcc test1.cpp test2.cpp
四、总结
“unresolved externals”错误是编译程序时常遇到的一个错误。由于该错误来源于程序中某些符号找不到,解决该错误通常需要检查函数或变量是否被正确定义、检查库是否正确链接、检查函数或变量名称是否正确,以及调整编译器的链接顺序。在编写程序时,我们应该尽量避免出现这个错误,以提高程序的可维护性和稳定性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/253890.html