2010-04-17 119 views
9

我目前有一個控制檯項目,它創建一個.exe文件;我希望它也創建一個.lib文件,這樣其他編譯爲DLL的項目將能夠從原始項目中調用函數。如何在Visual C++中創建.lib文件和.exe文件?

我知道這是可能的,但我無法找到如何做到這一點。我如何告訴鏈接器也鏈接一個.lib?

回答

8

一般情況下是不可能的 - 靜態庫和可執行文件是完全不同種類的動物。處理這種情況的方法是創建兩個項目 - 一個用於包含所有功能的庫。一個用於可執行文件,這是一個簡單的包裝器,只需調用庫中的函數即可。

+0

但是,在這裏我有一個vcproj文件,它會以exe和lib結尾......但是對於我的生活,我找不到什麼它這樣做。 http://svn.corecraft.org/aspire_mirror/trunk/win/VC90/hearthstone-world.vcproj – MoshiBin 2010-04-17 11:51:40

+0

@Spidey推測該項目包含兩個子項目。 – 2010-04-17 11:53:12

+0

同意。使exe項目依賴於lib項目,並在需要時自動重新編譯。 – 2010-04-17 11:53:50

0

你不「也鏈接一個庫」,你創建一個靜態庫項目。後者根本不會調用鏈接器 - 相反,它使用cl /c編譯所有文件,並使用lib.exe將生成的.obj組合成一個lib。

2

如果在一個應用程序(.exe)的項目的任何符號出口(例如,使用__declspec(dllexport)的),將產生兩個.exe和.lib文件 參見: Why does my Visual C++ .exe project build create .lib and .exp files?

+0

這是正確的w.r.t.標題中的問題。但是,這將如何幫助解決身體中的其他問題。 「能夠從原始[EXE]項目中調用函數」? – MSalters 2011-03-11 13:35:12

+0

您鏈接到生成的.lib; .exe的行爲如同一個DLL。即符號在運行時從.exe加載。 – 2011-03-28 20:14:42

+0

我測試了我在最後一條評論中寫的內容。它有時會工作,有時候不會,「無法初始化應用程序(0xC0000005)」錯誤。使用LoadLibrary和GetProcAddress我也結束了內存問題。所以實際上我不知道如何正確使用生成的.lib。 – 2011-04-07 14:30:48

11

發佈這只是作爲參考,我知道很久以前發佈了原始帖子,但這仍適用於需要解決此問題的任何人。

轉到項目你想爲一個.LIB文件,並按照下列步驟操作:

  1. 右鍵單擊該項目。
  2. 選擇屬性。
  3. 選擇構建事件。
  4. 選擇預先鏈接事件。
  5. 最後,在命令行復制粘貼此:

    @ECHO ON @ECHO "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj" "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

這將調用的lib工具生成的lib文件在所產生的目標文件。

+0

有點晚了,但想要謝謝你:)你只是讓我的生活變得更輕鬆 – 2017-04-15 17:07:03

+0

不客氣。 ;) – 2017-04-23 15:16:19

+0

在我的情況下,.obj的默認位置在項目文件夾中,所以我將「$(IntermediateOutputPath)* .obj」更改爲「$(SolutionDir)$(ProjectName)\ $(Configuration)\ * .obj」 。它工作正常,謝謝。 – elarmando 2018-03-01 17:10:49

0

令人驚訝的是,有多少貢獻者傲慢地堅持一個答案是錯誤的,當他們他們根本不知道答案。

要生成與您的.exe發生在預鏈接事件以下行相關的.LIB:

「$(VC_ExecutablePath_x86)\ LIB.EXE」/輸出:「$(OUTDIR)$(項目名) .lib「」$(IntermediateOutputPath)* .obj「

+0

這種技術似乎只能在調試模式下工作。 – user6664090 2018-02-27 23:34:45