Linux,静态库在可执行文件中引用其他静态库

3

我正在创建一个应用程序,它由两个静态库和一个可执行文件组成。

我们称这两个静态库为: libusefulclass.a libcore.a

应用程序为: myapp

libcore 实例化并使用在 libusefulclass 中定义的类(我们称之为 UsefulClass)

现在,如果我以以下方式链接应用程序:

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o -lusefulclass -lcore

链接器抱怨在libusefulclass中找不到方法:
undefined reference to `UsefulClass::foo()'

我找到了一个解决方法: 如果UsefulClass也在可执行文件的源文件中被实例化,那么应用程序将没有任何问题地链接。 我的问题是:有没有更好的方法让libcore引用在libusefulclass中定义的方法,或者静态库不能相互链接? 谢谢您! 附言:如果有关系的话:该应用程序使用Qt使用C++开发,但我觉得这不是Qt问题,而是一般的库问题。
1个回答

6

您需要按照依赖关系的相反顺序指定库,因此请使用

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o  -lcore -lusefulclass

如果存在循环依赖,您可能需要指定库两次。

g++ -m64 -Wl,-rpath,/usr/local/Trolltech/Qt-4.5.4/lib -o myapp src1.o src2.o srcN.o  -lusefulclass -lcore -lusefulclass

谢谢,nos,这确实解决了问题。(备注:对我来说,如果核心依赖于有用的类,则似乎反过来更合理,即有用的类在核心之前。不过我会记住上述规则的 :)) - andras
1
链接器从存档中读取符号并丢弃尚未被任何人引用的内容,然后下一个库需要链接器已经丢弃的符号 - 因此您必须以“相反”的顺序提供它们。 - nos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接