【问题标题】:Linux, static lib referring to other static lib within an executableLinux,静态库指的是可执行文件中的其他静态库
【发布时间】:2010-04-16 21:31:16
【问题描述】:

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

让我们调用两个静态库: libusefulclass.a libcore.a

以及应用程序: 我的应用程序

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 中定义的方法,或者静态库不能相互链接?

TIA

P.S.:如果重要的话:应用程序是使用 Qt 在 C++ 中开发的,但我觉得这不是 Qt 问题,而是一般的库问题。

【问题讨论】:

    标签: c++ linux static linker


    【解决方案1】:

    你需要按照依赖的相反顺序指定库,所以使用

    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
    

    【讨论】:

    • 谢谢,不,这确实解决了它。 (备注:对我来说,反过来似乎更合乎逻辑,即,如果核心依赖于有用类,则有用类先于核心......不过,我会记住上述规则:)
    • 链接器从存档中读取符号并丢弃任何没有人引用的东西,然后下一个库出现并需要链接器已经丢弃的符号 - 所以你必须在“反向”中提供它们" 顺序
    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多