2011-01-10 54 views
7

e.exe與我的自定義靜態庫c.lib鏈接,該庫使用在w.dll中定義的Win32 API。 w.dll位於C:\ Windows \ System32,其導入庫爲w.lib,位於Windows SDK目錄中。殼牌w.lib被列爲附加依賴​​c.libe.exe項目? (e.exe在這兩種情況下都能成功建立。)最佳做法是什麼?爲什麼?我猜e.exe不應該知道關於w.lib具有相關性的靜態庫

c.lib旨在僅由一組開發人員共享(不會發送給客戶)。

TEST:我用VS2008和DUMPBIN實用程序來測試這兩種情況下,這裏是結果:

  • 案例1:w.lib添加附加依賴​​c.lib項目。

dumpbin /archivemembers c.lib輸出列出了從c.lib項目作爲歸檔成員w.dll都偏移和.obj文件。

  • 案例2:w.libc.libe.exe項目添加其他相關

這一次,DUMPBIN輸出僅包含c.lib .obj文件和c.lib尺寸小於在情況1中

c.lib被添加爲附加依賴​​性w.exe項目在這兩種情況下)

注意:我用w.libw.dll這裏虛構,通用名稱爲Windows庫,但他們可能是如Userenv.lib和Userenv.dll或Version.lib和Version.dll ...

回答

1

我認爲你誤解了創建檔案和導入檔案所做的事情。

如您在評論中正確推測的那樣創建一個存檔,創建一個包含已編譯.objs的統一文件。現在,它可以包含您喜歡的任何代碼,包括但不限於對庫的動態調用。導入庫是一個包含obj的庫,它專門進行這種調用,想法是通過導入它,你的exe可以找到合適的符號(它們必須位於你創建的可執行文件中)。

創建從w.libc.lib的過程簡單地提取w.lib的對象,並將它們附加到物體在c.lib集合。實際上,c.lib成爲導入庫+代碼。

我認爲你應該這樣做嗎?不是真的 - 它可能導致混淆e.exe依賴於;我認爲你應該明確地做到這一點,而不是試圖隱藏它。這就是說,這只是一個建議,而不是一個規則。

+0

謝謝您的全面解答。我最初的推定是錯誤的 - 我認爲這是可取的exe不知道lib的依賴關係,但現在當我從* import library + code *的角度來看待它時,讓exe知道它的代碼是什麼包括來自靜態庫的代碼)依賴於。 – 2011-01-10 14:33:07

0

庫沒有鏈接,所以任何使用.lib的項目也都需要它的依賴關係。

基本上,.lib在鏈接過程中被「複製」到您的exe文件中。

如果你想避免你的用戶明確地鏈接againts w.lib,在dll中轉換c.lib,dll是鏈接的,並且在構建期間你不需要它們的依賴關係。

+0

據我所知,`link.exe`不能解析外部引用,而只是爲了創建靜態庫而壓縮一組`obj`文件。我的問題是關於編譯時的依賴關係 - 情況1顯示`e.exe`完全不知道`w.lib`。當然,`w.dll`必須在運行時出現。 – 2011-01-10 13:49:51