碰上G++连接错误,未定义函数
来源:互联网 发布:大数据技术课程体系 编辑:程序博客网 时间:2024/06/05 19:45
程序使用了一个静态库A,该库使用了另一个静态库B——程序没有直接使用B。连接时报错:B中的函数未定义。增加代码使得程序直接使用B后,问题解决。
因为程序没有直接使用B,所以连接器会认为B无用而不去连接B,从而导致了上述问题。可参考《Linux开发工具箱》。
示例:
****************
a.cpp,ar–crs生成liba.a
-----------------------
int a()
{
return 10;
}
b.cpp,ar–crs生成libb.a
-----------------------
int a();
int b()
{
return 2*a();
}
c.cpp,生成a.out
-----------------------
#include <iostream>
int b();
int main()
{
std::cout<<b()<<std::endl;
return 0;
}
1,执行“g++ c.cpp -la -lb -L. ”或“g++ c.cpp liba.a libb.a ”都报错“ undefined reference to `a()'”
2,仅在c.cpp中增加函数a()声明,仍然错误。
c.cpp
-----------------------
#include <iostream>
int a(); //增加声明
int b();
int main()
{
std::cout<<b()<<std::endl;
return 0;
}
3,增加对a()的调用后成功
c.cpp
-----------------------
#include <iostream>
int a();
int b();
int main()
{
a(); //增加调用
std::cout<<b()<<std::endl;
return 0;
}
4,执行“g++ c.cpp -L. -la -lb -la”成功
5,执行“g++ c.cpp -L. -Wl,--start-group -la -lb -Wl,--end-group”成功
解决方案总结:
1,增加对库的直接使用;
2,连接选项中重复该库,这样ld会多次搜索该库;
3,使用--start-group/--end-group选项,ld会多次搜索该选项所执行的库,这会增加连接时间;
- 碰上G++连接错误,未定义函数
- 函数未定义错误排查
- OpenGL 的exit函数未定义错误
- 未结束的常量字符串、函数未定义、××未定义、js中文乱码等js错误
- ArcEngine开发中“错误类型"****"未定义构造函数”
- 解决 Qt5 使用 OpenGL 函数未定义的错误
- Ubuntu下一种编译错误(未定义的函数)
- DWR变量未定义错误
- ‘webform_postbackoptions’未定义 错误
- insmod错误:符号未定义
- WebForm_PostBackOptions未定义错误
- WebService 未定义错误
- _beginthread,_endthread未定义错误
- Ajax 'sys' 未定义 错误
- _T 未定义错误
- FckEditorAPI未定义错误分析
- 解决未定义类型错误
- lager_transform未定义错误
- 回头不难
- Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
- 条款49:了解new-handler的行为
- Linux常用挂载点和目录
- 数论中的一些公式(转)
- 碰上G++连接错误,未定义函数
- exit()函数详解与Exit() 和 Return() 的区别
- Ubuntu 百度MP3在线听歌乱码完美解决方法
- 尽职尽责--因为我在那个位置上
- BREW开发ARM编译连接错误
- How to read pixel data of BMP file
- 做一个开发人员认可的测试人员(系列1)--测试是技术活,没技术也能干
- 在C#中调用windows API函数
- java 线程组