2011-01-10 29 views
15

我試圖建立在Visual Studio 2010中gtest轉換解決方案文件後,我試圖建立,而我得到了下面的警告信息。

Warning 1 warning MSB8012: 
TargetPath(C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest/Debug\gtest.lib) does not match 
the Library's OutputFile property value (C:\Users\sucho\Desktop\gtest-1.5.0\msvc\gtest\ 
Debug\gtestd.lib). 

This may cause your project to build incorrectly. 
To correct this, please make sure that $(OutDir), $(TargetName) and $(TargetExt) property 
values match the value specified in %(Lib.OutputFile). 
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets 

有消息稱我需要設置變量$(OutDir)$(TargetName)$(TargetExt),連同在%(Lib.OutputFile)指定的屬性值。

我如何能做到這一點與Visual Studio(VS尤其是2010)?

+0

請查看:[如何修復MSB8012(Lib.OutputFile)?](http://connect.microsoft.com/VisualStudio/feedback/details/523864/how-to-fix-msb8012-lib-outputfile) [Visual Studio 2010中 - $(的TargetName)宏(http://social.msdn.microsoft.com/Forums/en/vcprerelease/thread/3c03e730-6a0e-4ee4-a0d6-6a5c3ce4343c) – 2011-01-10 20:11:43

回答

3

警告是虛假的 - 假設你使用谷歌測試,它工作得很好

你可以但它消失。右鍵單擊有問題的項目並選擇屬性。在左側的樹視圖中選擇「Librarian」,並通過單擊輸出文件旁邊的框並選擇「從父​​項或項目默認繼承」來更改右側的「輸出文件」項。

+4

這是不正確的答案。這*改變了輸出文件的名稱,.lib的調試和發佈版本現在都被命名爲gtest。無論上次構建什麼,都會覆蓋該文件。當他最終將.lib的發佈版本鏈接到他想測試的代碼的調試版本時,這讓OP很麻煩。他後來刪除了這個問題,我猜他有點想清楚了。 – 2011-01-11 10:09:16

+1

@Hans:不正確。 Visual Studio已經將這些文件放在單獨的文件夾中。如果您決定將庫複製到單個目錄中,則只需要額外的「d」。 – 2011-01-11 14:22:07

23

我看到它。右鍵單擊gtest項目,屬性,配置屬性,常規。確保選擇了調試配置(左上角的組合)。目標名稱屬性更改爲

$(ProjectName)d 

注意添加「d」的名字從GTEST改爲gtestd。警告是否是良性的。

2

將舊項目升級到Visual Studio的新版本時(例如在VS2010中)以及項目設置可能已被手動更改(例如更改可執行文件名稱)時,通常會出現此類錯誤。我們知道VS2010使用這些宏$(ProjectName)$(TargetName)$(OutDir)$(TargetExt)控制釋放/調試輸出,但它往往是神祕的地方進行更改。我們通常通過Project >> Properties直接更改輸出文件的名稱。這意味着我們現在必須單獨更改輸出文件以進行調試和發佈構建,並且如果存在任何依賴關係,我們將得到像This may cause your project to build incorrectly.這樣的錯誤。

這些宏/屬性是VS2010默認,但你可以通過在記事本編輯它自己設定他們的.vcproj文件。首先請注意首先搜索.vcproj文件中的屬性,如果它的值不改變它的值,如果沒有定義它,如下所示。

<PropertyGroup Label="My Values"> 
    <ProjectName>New_Project_Name</ProjectName> 
    </PropertyGroup> 

上面我已經定義了一個新的<property group>保存這些值,但你可以在任何地方進行定義。我在調試/發佈配置組之後立即在文件的頂部定義它,以便它在任何地方都可見。確保您的項目屬性設置正確,以正確使用它們(它們應該是什麼VS2010默認設置)。如果你改變了它們,你應該從新的測試項目中複製它。您當然也可以在上面的組中添加您想爲其設置值的其他宏。

您也可以通過項目屬性驗證這個宏的新值。例如,單擊配置屬性>>常規,然後在「目標名稱」框中單擊。選擇編輯。它會彈出一個對話框,其中包含按鈕'MACROS >>'。點擊它,它會告訴你每個宏的價值。它應該正確地反映您在.vcproj文件中設置的新值。

8

我覺得沒有人有正確答案,我這樣解決:在項目屬性頁面中,檢查linker->General->Output file是否匹配configuration properties->General->target name & configuration properties->General->target extension

你不需要添加任何「d」,當然,更簡單的設置爲Inherit from parent or project defaults,所有3個變量。

例子:

Linker → General → Output File = "myproject.exe" 

則:

Configuration Properties → General → Target Name = "myproject" 

configuration properties → General → Target Extension = ".exe" 
0

的背景是,微軟改變了$(的TargetName)宏的含義。它用來表示「你輸入鏈接器|輸出文件的任何文件名,減去擴展名」。他們將其更改爲「默認情況下,您的項目的名稱」。 (在我看來,這是你永遠不應該做的事情;他們應該添加一個新的宏)。

儘管VS2008和更早版本能夠將文件名解析爲Linker設置,但顯然在遷移到較新版本時無法解析它,導致配置中斷。

警告本身可能並不重要,但如果你使用$(的TargetName),將它傳遞給一個批處理文件說,這種變化會破壞你的批處理過程。

對於我們來說,解決方案是從鏈接器複製文件名(減去擴展名)輸出文件到常規|目標名稱,然後設置鏈接器|輸出文件「從父母/默認繼承」。這是因爲我們使用了諸如「d」(用於調試),「u」用於Unicode的後綴,用於64位的_64等等。

在另一方面,如果你的輸出文件總是相匹配的項目的名稱,那麼所有你需要做的就是設置鏈接|輸出文件「繼承默認值」,原則上你已經完成了,只要你的編譯文件的輸出目錄與General |輸出目錄。

這種變化是絕對令人氣憤,因爲它涉及到從字面上走動數以百計的設置,都由於對微軟的一部分純粹的懶惰,據我所看到的。

相關問題