2014-04-28 119 views
0

大概我在這裏丟失了一些東西,但這是我第一次在Windows上,我需要靜態鏈接一個庫,以便可執行文件不會依賴於dll.I使用LIBPNG。在VC++中靜態鏈接一個庫

我不喜歡這樣寫道:

  1. 我加了libpng標題:C/C++ - >附加包含目錄

  2. 添加庫目錄的鏈接:鏈接器 - >常規 - > 附加圖書館目錄

  3. 新增連接額外的依賴:鏈接器 - >輸入

編譯EXE OK;當調用它我得到:

「程序無法啓動,因爲libpng16.dll從您的計算機 失蹤。」

這意味着libpng沒有編譯到可執行文件中。我如何解決這個問題,沒有reference the whole pnglib project code into my executable project

+1

錯誤中的「libpng16.dll」表示這是* not *一個靜態庫,但是一個動態鏈接庫。如果你只是將dll複製到與可執行文件相同的文件夾中,你可能會好起來。否則,您需要確保該庫確實支持靜態鏈接,然後將其鏈接到* correct * .lib文件中。 – crashmstr

+0

@crashmstr我不想這樣做。我想將libpng編譯到最終的程序中。 –

+0

我編輯了我的評論,包括一個聲明,你需要確保:1. libpng支持靜態鏈接和2.鏈接到正確的.lib是靜態庫,而不是「指向」DLL的鏈接。 – crashmstr

回答

1

在Windows上,.lib是一個庫文件,通常這只是包含加載dll,查找導出的函數並向其提供包裝的代碼。但是,您可以以不同方式構建庫,以便代替這些包裝存根,它包含實際的二進制代碼。 .lib的操作和結構是相同的 - 它包含的代碼取決於它的構建方式。

所以,如果你已經建立了libpng16作爲'動態'lib/dll對,那麼當你部署它時你需要dll部分。如果你只將它構建爲一個「靜態」庫,那麼你會得到你想要的。

問題是 - 您需要首先以您想要的格式構建庫。不可能將一個lib/dll對轉換成一個靜態庫,也不可能將一個dll合併到您的可執行文件中。 (當然,如果你修改了lib的設置並重新編譯爲以靜態庫形式生成,完全可能)

+0

嗯,我沒有看到,我需要然後弄清楚如何靜態構建libpng。 –

+0

是的。使用[Lib.exe](http://msdn.microsoft.com/en-us/library/ms235627.aspx)而不是Link.exe來生成lib。 – gbjbaanb

+0

我不確定我是否接到你。 –