2010-04-16 76 views
3

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

让我们把两个静态库: 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中定义的方法,或静态库只是不能链接到eachother?

TIA

P.S:如果该事项:应用程序正在开发在C++中使用Qt,但我觉得这不是一个Qt问题,但一般一个库的问题。

回答

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 
+0

谢谢,不,这确实解决了它。 (注意:对我来说,看起来更合乎逻辑,也就是说,有用类先于核心,如果核心取决于有用类...我会记住上述规则,尽管:) – andras 2010-04-16 22:00:51

+1

链接器读取符号,并放弃任何没有人引用的东西,然后下一个库出现,需要链接器已经丢弃的符号 - 所以您必须以“反向”顺序提供它们 – nos 2010-04-16 22:54:21