【问题标题】:Linking external static library in Qt creator在 Qt 创建器中链接外部静态库
【发布时间】:2014-09-07 03:52:56
【问题描述】:

我制作了一个带有两个子项目的 Qt 项目。一个是静态库,另一个是使用静态库的GUI应用。

由于这是一个子项目项目,我已经指定了两个部分的构建顺序。从项目树中的静态库开始,然后是项目树中的应用程序。使用 CONFIG+=ordered 选项完成。

我还需要第三个外部静态库。它位于我系统上的一个单独目录中。

因此,对于这两个子项目,我将以下内容添加到两个 .pro 文件中:

INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq -lbpp-core

然后对于应用程序子项目,我使用添加库向导来链接项目树中的库。

我编写了一个非常基本的 GUI,带有几个标签和一个文件菜单,以测试一切是否正常。

点击绿色运行按钮,应用成功运行,测试功能运行良好。

但是,当我来到构建文件夹时,双击可执行文件,没有任何反应。我打开终端并尝试再次启动它:

error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory

我无法理解,因为 .so 是共享对象,我原以为静态文件是 .a,我也很困惑为什么在 Qt Creator 中使用绿色箭头“运行”运行会起作用并运行程序,但从可执行文件中尝试会导致上述错误。我还有什么需要做的吗?

编辑:

第 3 方库说明如何使用 g++ 命令动态或静态链接。

动态联动:

g++ biohello.cpp \
    -o biohello \
    -I$bpp_dir/include \
    -L$bpp_dir/lib \
    -lbpp-seq -lbpp-core

静态联动:

g++ biohello.cpp \
    -o biohello \
    --static \
    -I$bpp_dir/include \
    -L$bpp_dir/lib \
    -lbpp-popgen -lbpp-phyl -lbpp-seq -lbpp-core
strip biohello

我已经能够使用第二个 g++ 命令静态链接命令行程序的库。我想实现相同的目标,但使用 gui 应用程序的 Qt Creator。

更新:

删除使用的两行:

INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq -lbpp-core

从两个 .pro 文件并尝试使用添加库向导在外部添加 .a 文件,从而添加:

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/release/ -lbpp-seq
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/debug/ -lbpp-seq
else:unix: LIBS += -L$$PWD/../../local/bpp/dev/lib/ -lbpp-seq

INCLUDEPATH += $$PWD/../../local/bpp/dev/include
DEPENDPATH += $$PWD/../../local/bpp/dev/include

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/libbpp-seq.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/libbpp-seq.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/bpp-seq.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/bpp-seq.lib
else:unix: PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/libbpp-seq.a

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/release/ -lbpp-core
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../local/bpp/dev/lib/debug/ -lbpp-core
else:unix: LIBS += -L$$PWD/../../local/bpp/dev/lib/ -lbpp-core

INCLUDEPATH += $$PWD/../../local/bpp/dev/include
DEPENDPATH += $$PWD/../../local/bpp/dev/include

win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/libbpp-core.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/libbpp-core.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/release/bpp-core.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/debug/bpp-core.lib
else:unix: PRE_TARGETDEPS += $$PWD/../../local/bpp/dev/lib/libbpp-core.a

到 .pro 文件,然后点击 Run 结果在 error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory

我没有尝试包含 .so 文件,仅包含带有添加库向导的 .a 文件:S

【问题讨论】:

  • 尝试同时添加PRE_TARGETDEPS += /local/yrq12edu/local/bpp/dev/lib/libbpp-seq.aPRE_TARGETDEPS += /local/yrq12edu/local/bpp/dev/lib/libbpp-core.a

标签: c++ qt static-libraries


【解决方案1】:

除非您也将可执行 GUI 构建为静态程序,否则它可以使用静态库并动态加载 (.so)。所以我收集到您创建的库是静态链接的,而第 3 方 (libbpp) 是动态的。

要构建静态可执行文件,还需要静态链接所有库。因此,如果您为libppp 安装了静态库,您应该能够制作静态 QT 应用程序(假设它是 QT 中支持的项目类型)。

关于共享对象的错误信息。如果您希望您的应用程序在 QT 之外运行,则必须将类似这样的内容添加到 /etc/ld.conf

/local/yrq12edu/local/bpp/dev/lib

这会将您的 bpp 库的路径添加到动态加载程序搜索路径中。更改为/etc/ld.conf 后,您需要运行以下命令:

ldconfig

我不知道 QT 的内部工作原理,但它可能会起作用,因为它在幕后手动将 /local/yrq12edu/local/bpp/dev/lib 添加到库对象的搜索路径中(无需修改 /etc/ld .conf)

如果您尝试在链接时动态加载任何内容,则将可执行文件专门编译为-static 将产生错误。要获得完全静态的二进制文件,您还需要使用运行时的静态版本 (c/c++)。使用 GCC,您可以强制使用静态 C 运行时 -static-libgcc 和 C++ 使用 -static-libstdc++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多