碰上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会多次搜索该选项所执行的库,这会增加连接时间;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值