LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1665|回复: 1

求助:关于g++链接顺序

[复制链接]
发表于 2007-10-25 20:42:45 | 显示全部楼层 |阅读模式
程序是用C++写的,在linux下用g++编译,
命令:
g++ -o ../../../../../../bin/MCTFPreProcessorStaticd -Wall -
MCTF.d.o ./objects/MCTFPreProcessor.d.o ./objects/MCTFPreProcessorTest.d.o ./
objects/PreProcessor.d.o ./objects/PreProcessorParameter.d.o -
L../../../../../../lib -lpthread -lH264AVCCommonLibStaticd -
lH264AVCVideoIoLibStaticd -lH264AVCEncoderLibStaticd
提示:
undefined reference to
`h264::CabacContextModel2DBuffer::CabacContextModel2DBuffer(unsigned int,
unsigned int)'和undefined reference to
`h264::CabacContextModel2DBuffer::~CabacContextModel2DBuffer()',
其中CabacContextModel2DBuffer是类名,编译后的.o文件包含在
H264AVCCommonLibStaticd中.
如果将命令修改为:
g++ -o ../../../../../../bin/MCTFPreProcessorStaticd -Wall -
MCTF.d.o ./objects/MCTFPreProcessor.d.o ./objects/MCTFPreProcessorTest.d.o ./
objects/PreProcessor.d.o ./objects/PreProcessorParameter.d.o -
L../../../../../../lib -lpthread -lH264AVCEncoderLibStaticd -
lH264AVCCommonLibStaticd -lH264AVCVideoIoLibStaticd
也就是将-lpthread后面的链接顺序改变一下,就可以正常编译。

如果将命令修改为:g++ -o ../../../../../../bin/MCTFPreProcessorStaticd -Wall -
m32  ./objects/MCTF.d.o ./objects/MCTFPreProcessor.d.o ./objects/MCTFPreProce
ssorTest.d.o ./objects/PreProcessor.d.o ./objects/PreProcessorParameter.d.o -
L../../../../../../lib -lpthread ./objects/CabacContextModel2DBuffer.d.o -
lH264AVCCommonLibStaticd -lH264AVCVideoIoLibStaticd -H264AVCEncoderLibStaticd
也就是在-lpthread后面加入./objects/CabacContextModel2DBuffer.d.o,也可以正常
编译,但是如果将./objects/CabacContextModel2DBuffer.d.o加在最后面,编译报错。

请问这是怎么回事?
为什么编译报错只提示是构造函数和析构函数找不到?CabacContextModel2DBuffer类还
包含其他的函数(注:只有构造函数和析构函数是写在CabacContextModel2DBuffer.cpp文
件中,其他的函数是写在CabacContextModel2DBuffer.h中,猜想是不是和inline函数有
关?)
g++在链接多个库文件的时候,先链接哪个?链接顺序如何?
不胜感激!小弟以前没有用过g++,google了n久没有找到结果,望各位大侠指教!
发表于 2007-10-25 22:06:39 | 显示全部楼层
如果不想让 g++ 的 linker 出现奇怪的 undefined reference 错误, 在编排库文件的顺序时最好遵循"[color="Red"]先引用, 后定义"的原则.

看你给出的输出, 很可能在 库H264AVCEncoder 中使用了 库H264AVCCommon 中定义的类CabacContextModel2DBuffer , 所以 H264AVCCommon 应该在 H264AVCEncoder 之后出现 (正如你在第一种修改中所做).

[color="Red"]简单的说就是: 越基础的库, 越往后面写.

另外, 由于 CabacContextModel2DBuffer 类的其它方法都在头文件中给出了inline定义, 这些方法(函数)直接被编译进了引用它们的目标文件中, 不会存在 undefined 的问题.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表