程序使用了一个静态库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会多次搜索该选项所执行的库,这会增加连接时间;
本文探讨了在使用静态库时遇到的连接错误问题,特别是当一个程序间接引用了某个静态库时,连接器可能会忽略该库导致函数未定义的错误。通过增加对库的直接调用或调整链接选项可以解决此问题。
950

被折叠的 条评论
为什么被折叠?



