C++ 编译报错 undefined reference to (找不到声明)快速排查
发布网友
发布时间:2024-09-26 18:14
我来回答
共1个回答
热心网友
时间:2024-10-03 19:00
可能原因:
Case 1: 链接时缺少定义了XXX的源文件、目标文件或库文件。
1.1 缺少源文件。
1.2 缺少目标文件。
1.3 缺少库文件。
Case 2: 链接顺序不对,多个库文件链接顺序问题或存在嵌套链接。
Case 3: 函数符号修饰不一致。
3.1 函数定义和声明不一致。
3.2 C和C++混合编程(在C++代码中链接C语言的库),解决方案是使用extern "C"处理为模块。
3.3 编译器版本或编译器选项不一致。
Case 4: 把模板函数写进了cpp文件中。
Case 5: API隐藏,常见于开源库不兼容的情况,库升级后API变为隐藏。
手动找到函数声明:
如何查看动态库文件提供了哪些函数符号?将bar.cpp文件编译成动态库bar.so文件,该文件提供了函数void bar(int)的实现。使用nm命令可以查看bar.so库中提供的函数符号。
nm -C可以查看函数名字修饰之前的名字。
如何推函数声明?已知函数修饰后的名字,可以使用c++filt命令反推函数源文件中的声明。
总结:
1. 检查编译器是否找不到定义了XXX的文件。
2. 检查由于函数修饰原因,定义了XXX的文件中是否缺少想要的XXX符号。
3. 找到想要的符号,但该符号是隐藏属性,不能链接使用。
若不确定库中是否有这个XXX符号,使用nm查找,使用c++filt从修饰后的符号找函数声明。
热心网友
时间:2024-10-03 18:56
可能原因:
Case 1: 链接时缺少定义了XXX的源文件、目标文件或库文件。
1.1 缺少源文件。
1.2 缺少目标文件。
1.3 缺少库文件。
Case 2: 链接顺序不对,多个库文件链接顺序问题或存在嵌套链接。
Case 3: 函数符号修饰不一致。
3.1 函数定义和声明不一致。
3.2 C和C++混合编程(在C++代码中链接C语言的库),解决方案是使用extern "C"处理为模块。
3.3 编译器版本或编译器选项不一致。
Case 4: 把模板函数写进了cpp文件中。
Case 5: API隐藏,常见于开源库不兼容的情况,库升级后API变为隐藏。
手动找到函数声明:
如何查看动态库文件提供了哪些函数符号?将bar.cpp文件编译成动态库bar.so文件,该文件提供了函数void bar(int)的实现。使用nm命令可以查看bar.so库中提供的函数符号。
nm -C可以查看函数名字修饰之前的名字。
如何推函数声明?已知函数修饰后的名字,可以使用c++filt命令反推函数源文件中的声明。
总结:
1. 检查编译器是否找不到定义了XXX的文件。
2. 检查由于函数修饰原因,定义了XXX的文件中是否缺少想要的XXX符号。
3. 找到想要的符号,但该符号是隐藏属性,不能链接使用。
若不确定库中是否有这个XXX符号,使用nm查找,使用c++filt从修饰后的符号找函数声明。