我用两个子项目制作了一个Qt项目。一个是静态库,另一个是使用静态库的GUI应用程序。
由于这是一个子项目项目,我已经指定了构建这两个部分的顺序。从项目树中的静态库开始,然后是项目树中的应用程序。完成CONFIG + = ordered选项。
我还需要第三个外部静态库。它位于我系统的单独目录中。
因此,对于这两个子项目,我将以下内容添加到两个.pro文件中:
INCLUDEPATH += /local/yrq12edu/local/bpp/dev/include
LIBS += -L/local/yrq12edu/local/bpp/dev/lib -lbpp-seq -lbpp-core
然后,对于app子项目,我使用Add Library向导链接项目树中的库。
我写了一个非常基本的GUI,带有一些标签和一个文件菜单,以测试一切正常。
单击绿色运行按钮可以成功运行应用程序,测试功能也能正常运行。
然而,当我来到build文件夹时,双击可执行文件,没有任何反应。我打开终端并尝试再次启动它:
error while loading shared libraries: libbpp-seq.so.9: cannot open shared object file: No such file or directory
我无法理解这一点。因为.so是共享对象,我原以为它会是静态文件的.a我也很困惑为什么在Qt Creator中运行绿箭'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 app的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
我没有尝试包含.so文件,只包含添加库向导的.a文件:S
答案 0 :(得分:1)
除非您将可执行GUI构建为静态程序,否则它可以使用静态库并动态加载(.so)。所以我收集你创建的库是静态链接的,第三方(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添加到库对象的搜索路径中(无需修改/等) /ld.conf)
如果您尝试在链接时动态加载任何内容,则专门将可执行文件编译为-static
将产生错误。要获得完全静态的二进制文件,您还需要使用运行时的静态版本(c / c ++)。使用GCC,您可以使用-static-libgcc
强制使用静态C运行时,并使用-static-libstdc++
强制使用C ++。