2011-11-10 89 views
3

我正在將應用程序從MySQL移動到Postgres。當我嘗試編譯連接到數據庫的簡單應用程序時,我可以將其與libpq.lib鏈接,並且編譯和執行成功。但是,這需要我在我的程序的目錄中包含大約8 .dll文件,這非常令人煩惱。有什麼方法可以靜態鏈接libpq.lib,所以我不需要任何.dll文件?我在Windows7 x64上,我正試圖建立一個在x64和x86窗口上工作的獨立於體系結構的應用程序。我正在使用libpq版本8.4.9.1。謝謝!在C++中靜態鏈接libpq ++ postgresql

更新:我已經嘗試將#define PQ_STATIC-static添加到鏈接器標誌。我也從源代碼編譯了libpq.a,但以上都沒有奏效。

回答

1

一般來說,有兩種庫。一個編譯爲動態鏈接,另一個編譯爲靜態鏈接。在你的情況下,你可能會鏈接編譯爲動態鏈接的庫。所以,你需要的是靜態鏈接庫。在很多情況下,這樣的文件被命名爲*_s.lib,表示靜態鏈接庫。

在Linux中,.a文件是靜態庫。一旦你與這些鏈接,你將不需要它們在運行時。而在Windows中,您總是編譯並鏈接.lib文件。在編譯階段,你不會發現任何區別。其中一些.lib文件包含實際的代碼。這些是靜態庫。其他包含分別指向.dll的實現指針。

+0

我剛剛嘗試從源代碼編譯庫,並獲得libpq.a,然後我與應用程序鏈接成功編譯。但是,我仍然無法運行沒有'.dll'文件的程序。我認爲有一些'#define'我缺少或編譯器標誌。請注意,'libpq.a'大於'libpq.lib'。 – user99545

+0

'libpq.a'將會比'libpq.lib'更大,因爲它包含了實現。 – dipesh

3

Libpq需要一些非常大的庫,如openssl用於加密連接,zlib用於壓縮,iconv用於字符集轉換等。您必須將它們全部編譯爲靜態庫,然後將libpq編譯爲靜態庫,然後靜態編譯程序。我認爲這樣做太多了,收益太少。

有一個商業工具,PgWare Alloy 4,它可以用來合併DLL與EXE。我想它只是提取所有合併文件到臨時目錄,然後從這個目錄運行你的程序。