Linux,静态库引用可执行文件中的其他静态库
问题描述:
我正在创建一个应用程序,它由两个静态库和一个可执行文件组成。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问题,但一般一个库的问题。
答
你需要指定依赖性相反的顺序库,所以使用
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
谢谢,不,这确实解决了它。 (注意:对我来说,看起来更合乎逻辑,也就是说,有用类先于核心,如果核心取决于有用类...我会记住上述规则,尽管:) – andras 2010-04-16 22:00:51
链接器读取符号,并放弃任何没有人引用的东西,然后下一个库出现,需要链接器已经丢弃的符号 - 所以您必须以“反向”顺序提供它们 – nos 2010-04-16 22:54:21