簡體   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