[英]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.