链接Qt创建器中的外部静态库

时间:2014-09-07 03:52:56

标签: c++ qt static-libraries

我用两个子项目制作了一个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

1 个答案:

答案 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 ++。