程序使用了一个静态库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会多次搜索该选项所执行的库,这会增加连接时间;