gpt4 book ai didi

c++ - 在 Qt Creator 中链接外部静态库

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:42 25 4
gpt4 key购买 nike

我创建了一个包含两个子项目的 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++ 命令静态链接命令行程序的库。我想实现相同但使用 Qt Creator 的 gui 应用程序。

更新:

删除使用的两行:

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 文件但随后点击运行导致 加载共享库时出错:libbpp-seq.so.9:无法打开共享对象文件:没有这样的文件或目录

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

最佳答案

除非您将可执行 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,您可以使用 -static-libgcc 强制使用静态 C 运行时,使用 C++ 使用 -static-libstdc++

关于c++ - 在 Qt Creator 中链接外部静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com