這個問題說明了所有的事情。我正在使用Qt Creator,它使用QMake,我想構建一個共享庫文件,它具有靜態鏈接的所有依賴關係。像libstdc++
等如何在Qt Creator的共享庫中建立靜態鏈接?
但是,當我使用CONFIG += static
它也將庫更改爲靜態庫,併產生一個.a
靜態文件,我不想它。 所以我的問題不是this的重複。
我搜索了here但我找不到合適的東西。
這個問題說明了所有的事情。我正在使用Qt Creator,它使用QMake,我想構建一個共享庫文件,它具有靜態鏈接的所有依賴關係。像libstdc++
等如何在Qt Creator的共享庫中建立靜態鏈接?
但是,當我使用CONFIG += static
它也將庫更改爲靜態庫,併產生一個.a
靜態文件,我不想它。 所以我的問題不是this的重複。
我搜索了here但我找不到合適的東西。
CONFIG += static
是錯誤的標誌,如文件規定:
The target is a static library (lib only). The proper compiler flags will automatically be added to the project.
如果你想靜態鏈接的相關性,併產生一個共享庫,你需要一個標誌傳遞給鏈接器,所以加QMAKE_LFLAGS += -static
到您的.pro
文件。
一個簡單的測試會導致一個沒有該標誌的16kb dll,以及一個995kb的dll。此外,如果依賴walker被信任,較大的dll沒有外部依賴性,而較小的依賴於libgcc
和libstdc++
(這只是一個簡單的std::cout
測試)。
顯然,你並不需要一個靜態的qt或qmake構建。使用Qt的「stock」32bit mingw版本進行測試。
您需要三樣東西:
對於所有這一切,您需要使用-static -static-runtime
參數配置自定義Qt版本。你使用這個Qt構建的任何可執行文件/庫都將靜態鏈接到運行時並靜態鏈接到Qt(如果它使用Qt)。
值得注意的是,以上都不需要對您的項目的.pro
文件進行任何更改。相反,對於您的項目文件來說,沒有什麼能夠達到相同的效果,一般來說。你必須得到一個正確配置的Qt,並且從那裏處理所有的東西。
除了存在管理構建的項目文件之外,您的庫本身沒有要求使用Qt。例如,這將是不使用Qt 也不 C++一個基本庫:
TARGET = mylib
TEMPLATE = lib
CONFIG -= qt
SOURCES = mylib.c
HEADERS = mylib.h
只要從如上構造一個Qt調用qmake
,共享庫不會動態鏈接到語言運行時(也不是Qt,但在這種情況下,它根本不會鏈接到Qt!)。
1 - 爲什麼?他想做的是製作一個共享庫,它靜態鏈接自己的依賴關係。 – dtech
使用QMAKE_LFLAG_RELEASE怎麼樣? –
@ddriver因爲如果你沒有Qt的靜態構建,那麼Qt依賴不能被靜態滿足:靜態鏈接的對象存檔不存在。 –
當我使用CONFIG + = static時,它編譯好沒有錯誤。但是當我使用QMAKE_LFLAGS + = -static它讓我看到這些錯誤: 錯誤:無法找到-lgnustl_shared 錯誤:無法找到-llog 錯誤:找不到-lz 錯誤:無法找到-ldl –
如果你想靜態鏈接到圖書館,您必須擁有該圖書館的靜態版本。 '-lgnustl_shared'聽起來很像它是一個共享庫,通常沒有'_shared'後綴,鏈接器會查找庫的'.a'版本,但在你的情況下,沒有這種東西。實際的庫是'-lgnustl_static'。沒有這個標記,你不會得到錯誤,因爲如果沒有它,你根本就沒有靜態鏈接。 – dtech
我再說一遍,當我使用CONFIG + = static時,它編譯好沒有錯誤。 –