2014-02-25 84 views
5

我正在配置我的項目以x86和x64位構建,爲了做到這一點,我必須更改不同配置的目標機器。在Visual Studio 2012中,Librarian和Linker有什麼區別?

我試圖找到爲我的本地C++庫設置目標機器的位置,並且我找到了this post

但是我沒有鏈接在本地C++庫項目,我有「配置屬性 - >鏈接 - >高級 - >目標機」只在C++/CLI項目選項。

在Native C++ Library項目中,我有一個「館員」部分。我搜索了一下,發現目標機器在:配置屬性 - >圖書管理員 - >常規 - >目標機器。

圖書管理員部分似乎有比鏈接器少的選項。

圖書館員連接器節相同嗎?關於我在谷歌搜索的文檔,我只看到鏈接器提到。

也許我有一些配置錯誤?或者在這post答案沒有提到Native C++?

回答

6

圖書管理員和鏈接器部分是否相同?在我在google上搜索的文檔中,我只看到Linker提到。

它們幾乎相同。當你的項目將成爲一個靜態庫時,圖書管理員已啓用。鏈接器用於可執行文件和動態庫(dll)。

雖然動態庫將動態鏈接到您正在構建的可執行文件,這意味着dll必須在執行時執行,靜態庫將成爲可執行文件的一部分。靜態庫不能鏈接到某些動態庫,因爲鏈接應該在生成可執行文件的時候完成,除此之外它會導致模糊。這就是圖書館員選項減少的原因。 (例如,沒有輸入選項)。

也許我有一些配置錯誤?或者在這post答案沒有提到Native C++?

他的項目生成一個DLL,而不是一個靜態庫。檢查您的設置配置屬性 - >常規 - >配置類型

4

當您創建靜態庫項目時,您會看到圖書管理員部分。請注意,這樣的項目是不兼容的與使用/ clr選項構建的代碼,託管的代碼在運行時鏈接,而不是生成時間。嘗試使用這樣的.lib文件在嘗試構建程序集時很難診斷鏈接程序錯誤。如果您將它用於純本機代碼(沒有/ clr生效),那也沒問題。

對.lib文件很少,它只是一包.obj文件。把它想成一個。zip壓縮率爲cr * ppy的壓縮文件。 lib.exe實用程序可以將.obj和.lib文件添加到.lib中,並將其從.lib中刪除,並將其視爲winzip。

因此,在常規部分確實只有很少的設置,lib.exe並沒有太多設置。幾乎是一個到lib.exe所需的command line options的一對一映射。/MACHINE選項(又名目標機器設置)不是必需的,它由您使用的編譯器修復。它被記錄爲:

但是,在某些情況下,LIB無法確定機器類型併發出錯誤消息。如果發生這種錯誤,請指定/ MACHINE。

所以從頭開始這個想法。它完全由您用於項目的平臺選擇所鎖定。 VS中的標準代碼是Win32來生成32位代碼和x64來生成64位代碼。

+0

我的靜態庫是純粹的C++代碼。但是我從C++/CLI項目中使用它們。這可以嗎? – Dzyann

+1

是的,這是一個支持和常見的情況。唯一需要注意的是C++/CLI源代碼中的#includes,它們可能必須被#pragma包裝,以便告訴編譯器.h文件包含非託管代碼的聲明。對於沒有明確聲明它們是__cdecl的自由函數很重要。當然,你必須告訴鏈接器鏈接.lib。 –

相關問題