已成功连接到库却undefined reference to 错误

遇到了一个非常诡异的事情,makefile 已经写好:
`cppflags=
headers=-I ../../inc
libs=-lpuck -L ../../lib

../bin/input: input.cpp
mkdir -p ../bin
g++ $(cppflags) $(headers) $(libs) -o $@ $^`

本来这个makefile 在centos下是没有问题的,然而在ubuntu下出现了问题,虽然已经成功链接到库文件,但是还是会有undefined reference to的错误,通常来讲,这种问题只会没有成功连接到库文件的时候才会出现,gcc/++在编译时查找库文件的顺序是:
1、-L 指定的路径, 从左到右依次查找
2、由 环境变量 LIBRARY_PATH 指定的路径,使用”:”分割从左到右依次查找
3、/etc/ld.so.conf 指定的路径顺序
4、/lib 和 /usr/lib (64位下是/lib64和/usr/lib64)

所以我这个makefile直接就满足了第一条,但还是有错误,在网上查了一下,竟然调整了一下连接选项的位置就可以了!!:
`cppflags=
headers=-I ../../inc
libs=-lpuck -L ../../lib

../bin/input: input.cpp
mkdir -p ../bin
g++ -o $@ $^ $(cppflags) $(headers) $(libs) `
不知道这是什么原因,看来是不同系统下这个gcc/++实现也是有所差距,有知道的还望指明原因。。

有一点眉目,但也不能解释现在这个问题,对于-l链接库的顺序,编译器是从右往左连接的,如果链接库之间有依赖关系,应当注意链接库的顺序,比如 库A 依赖 库B,那么写成 -lB -lA就会报错。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态的"undefined reference to"错误通常是因为以下几个原因引起的。 首先,可能是没有正确指定对应的。当使用了中定义的实体,但没有指定(-lXXX)或者没有指定路径(-LYYY),就会导致该错误。 其次,连接参数的顺序可能不正确。在默认情况下,对于-l使用的要求是越是基础的越要写在后面,无论是静态还是动态。 另外,gcc/ld的版本不匹配也可能导致这个错误。由于gcc2到gcc3大版本的兼容性存在问题,当在高版本机器上使用低版本的机器就会出现这样的错误。此外,在32位的环境上不小心使用了64位的,或者在64位环境中使用了32位的,也会引发这个问题。 此外,C/C++相互依赖和链接也可能导致该错误。在我们的64位环境中,gcc链接g++的还需要加上-lstdc++,同时需要确保能够extern "C"两边都可以使用的接口。 最后,对于动态链接,实际的符号定位是在运行时进行的。如果在编译.so的时候忘记把它需要的一起进行联编,就会导致该错误。例如,libx.so需要使用uldict,但在编译libx.so的时候忘记加上-luldict参数。此时,编译libx.so不会报错,因为它被认为是一个,里面存在一些不知道具体实现的符号是合法的,可以在运行时指定或者在编译其他二进制程序时指定。 综上所述,动态"undefined reference to"错误可能是由以上几个原因引起的。请检查你的代码和编译参数,确保正确指定了并正确设置连接参数的顺序。如果仍然无法解决问题,可能需要进一步检查版本兼容性和符号定位的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值