碰上G++连接错误,未定义函数

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

 

你可能感兴趣的:(linux,开发工具,iostream,reference)