簡體   English   中英

將外部庫添加到 Qt Creator 項目中

[英]Adding external library into Qt Creator project

如何將外部庫添加到由 Qt Creator RC1(版本 0.9.2)構建的項目中? 比如win32函數EnumProcesses()需要在項目中添加Psapi.lib才能構建。

正確的做法是這樣的:

LIBS += -L/path/to -lpsapi

這樣它就可以在 Qt 支持的所有平台上工作。 這個想法是你必須將目錄與庫名分開(沒有擴展名,也沒有任何“lib”前綴)。 當然,如果您包含 Windows 特定的庫,這真的無關緊要。

如果要將 lib 文件存儲在項目目錄中,可以使用$$_PRO_FILE_PWD_變量引用它們,例如:

LIBS += -L"$$_PRO_FILE_PWD_/3rdparty/libs/" -lpsapi

你在使用qmake項目嗎? 如果是這樣,您可以使用LIBS變量添加外部庫。 例如:

win32:LIBS += path/to/Psapi.lib

LIBS += C:\\Program Files\\OpenCV\\lib

將不起作用,因為您在程序文件中使用空格。 在這種情況下,您必須添加引號,因此結果將如下所示: LIBS += "C:\\Program Files\\OpenCV\\lib" 我建議將庫放在非空白位置;-)

您的意思是由於缺少其他包含路徑而導致的錯誤。 嘗試添加它: INCLUDEPATH += C:\\path\\to\\include\\files\\ 希望它有效。 問候。

並添加多個庫文件,您可以編寫如下:

INCLUDEPATH *= E:/DebugLibrary/VTK E:/DebugLibrary/VTK/Common E:/DebugLibrary/VTK/Filtering E:/DebugLibrary/VTK/GenericFiltering E:/DebugLibrary/VTK/Graphics E:/DebugLibrary/VTK/GUISupport/ Qt E:/DebugLibrary/VTK/Hybrid E:/DebugLibrary/VTK/Imaging E:/DebugLibrary/VTK/IO E:/DebugLibrary/VTK/Parallel E:/DebugLibrary/VTK/Rendering E:/DebugLibrary/VTK/Utilities E :/DebugLibrary/VTK/VolumeRendering E:/DebugLibrary/VTK/Widgets E:/DebugLibrary/VTK/Wrapping

LIBS *= -LE:/DebugLibrary/VTKBin/bin/release -lvtkCommon -lvtksys -lQVTK -lvtkWidgets -lvtkRendering -lvtkGraphics -lvtkImaging -lvtkIO -lvtkFiltering -lvtkDICOMParser -lvtkpng -lvtktiff -lvtlvtlgtcflvtcflvtlfkexp -lvtkfreetype -lvtkHybrid -lvtkVolumeRendering -lQVTKWidgetPlugin -lvtkGenericFiltering

如果您想在客戶的機器上部署您的應用程序,而不是只使用您自己的應用程序,我們發現LIBS+= -Lxxx -lyyy方法即使沒有問題也會導致混淆。

我們使用 Qt 為 Linux、Mac 和 Windows 開發應用程序。 我們提供完整的獨立應用程序。 所以所有非系統庫都應該包含在部署包中。 我們希望我們的客戶能夠從同一個 USB 記憶棒為所有操作系統運行應用程序。 出於平台兼容性的原因,USB 記憶棒必須格式化為 FAT32,它不支持 (Linux) 符號鏈接。

我們發現LIBS+= -Lxxx -lyyy習語太多了:

  1. 我們並不完全知道鏈接器找到的(靜態或動態)庫的文件路徑是什么。 這很不方便。 我們的 Mac 鏈接器經常發現與我們認為應該使用的庫不同的庫。 這種情況在 OpenSSL 庫中發生過多次,Mac 鏈接器發現並使用了它自己的(較舊的、不兼容的)OpenSSL 版本,而不是我們請求的版本。

  2. 我們不能承受鏈接器使用指向庫的符號鏈接,因為這會破壞部署包。

  3. 我們想從庫中看出我們鏈接的是靜態庫還是動態庫。

所以對於我們的特殊情況,我們只使用絕對文件路徑並檢查它們是否存在。 我們刪除所有符號鏈接。

首先,我們找出我們使用的操作系統並將其放入 CONFIG 變量中。 並且,例如對於 Linux 64 位,則:

linux64 {
    LIBSSL= $$OPENSSLPATH/linux64/lib/libssl.a
    !exists($$LIBSSL): error ("Not existing $$LIBSSL")
    LIBS+= $$LIBSSL
    LIBCRYPTO= $$OPENSSLPATH/linux64/lib/libcrypto.a
    !exists($$LIBCRYPTO): error ("Not existing $$LIBCRYPTO")
    LIBS+= $$LIBCRYPTO
}

所有依賴項都可以復制到部署包中,因為我們知道它們的文件路徑。

為了完整起見,我想補充一點,您還可以僅添加 LIBRARY PATH,它會在其中查找依賴庫(它可能不會在您的代碼中直接引用,但您使用的庫可能需要它)。

為了進行比較,這與 LIBPATH 環境所做的相對應,但它在 Qt Creator 中有點模糊並且沒有很好的文檔記錄。

我解決這個問題的方式如下:

LIBS += -L"$$_PRO_FILE_PWD_/Path_to_Psapi_lib/"

基本上,如果您不提供實際的庫名稱,它會添加搜索依賴庫的位置的路徑。 語法上的差異很小,但這對於僅提供 PATH 查找依賴庫的位置非常有用。 有時提供每個路徑單獨的庫是一件很痛苦的事情,你知道它們都在某個文件夾中,Qt Creator 會選擇它們。

在 .pro 中: LIBS += Ole32.lib OleAut32.lib Psapi.lib advapi32.lib

在 .h/.cpp 中: #pragma comment(lib,"user32.lib")

#pragma comment(lib,"psapi.lib")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM