2016-11-28 152 views
0

這個問題說明了所有的事情。我正在使用Qt Creator,它使用QMake,我想構建一個共享庫文件,它具有靜態鏈接的所有依賴關係。像libstdc++如何在Qt Creator的共享庫中建立靜態鏈接?

但是,當我使用CONFIG += static它也將庫更改爲靜態庫,併產生一個.a靜態文件,我不想它。 所以我的問題不是this的重複。

我搜索了here但我找不到合適的東西。

回答

0

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沒有外部依賴性,而較小的依賴於libgcclibstdc++(這只是一個簡單的std::cout測試)。

顯然,你並不需要一個靜態的qt或qmake構建。使用Qt的「stock」32bit mingw版本進行測試。

+0

當我使用CONFIG + = static時,它編譯好沒有錯誤。但是當我使用QMAKE_LFLAGS + = -static它讓我看到這些錯誤: 錯誤:無法找到-lgnustl_shared 錯誤:無法找到-llog 錯誤:找不到-lz 錯誤:無法找到-ldl –

+0

如果你想靜態鏈接到圖書館,您必須擁有該圖書館的靜態版本。 '-lgnustl_shared'聽起來很像它是一個共享庫,通常沒有'_shared'後綴,鏈接器會查找庫的'.a'版本,但在你的情況下,沒有這種東西。實際的庫是'-lgnustl_static'。沒有這個標記,你不會得到錯誤,因爲如果沒有它,你根本就沒有靜態鏈接。 – dtech

+0

我再說一遍,當我使用CONFIG + = static時,它編譯好沒有錯誤。 –

-1

您需要三樣東西:

  1. 您需要的Qt本身建成一個靜態庫:
  2. 你沒必要說的Qt靜態鏈接到運行時。
  3. 您需要將庫靜態鏈接到運行時。這是自動處理的。

對於所有這一切,您需要使用-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!)。

+0

1 - 爲什麼?他想做的是製作一個共享庫,它靜態鏈接自己的依賴關係。 – dtech

+0

使用QMAKE_LFLAG_RELEASE怎麼樣? –

+0

@ddriver因爲如果你沒有Qt的靜態構建,那麼Qt依賴不能被靜態滿足:靜態鏈接的對象存檔不存在。 –