繁体   English   中英

在Qt Creator中链接外部静态库

[英]Linking external static library in Qt creator

我做了一个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,其中包含一些标签和一个File菜单,以测试一切正常。

单击绿色的运行按钮将导致应用程序成功运行,并且测试功能运行良好。

但是,当我进入构建文件夹时,双击可执行文件,什么也没有发生。 我打开终端并尝试再次启动它:

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

我很难理解为.so是共享库,我本以为静态文件将是.a,但我也感到困惑,为什么在Qt Creator中使用Green Arrow'Run'可以运行并运行程序,但尝试从可执行文件会导致上述错误。 还有什么我需要做的吗?

编辑:

第三方库说明如何使用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文件,但error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory运行会导致error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory

我没有尝试使用添加库向导添加.so文件,仅添加.a文件:S

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

要构建静态可执行文件,还需要将所有库静态链接。 因此,如果为libppp安装了静态库, 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 ++使用-static-libstdc++强制使用静态C运行时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM