2017-02-27 62 views
0

我想在VS2008中創建我的C++項目並使用MSBuild升級到VS2013。 我引用3個第三方dll。 在我使用的項目設置中/ SAFESEH:NO。在Visual Studio中構建我的項目時,通過此設置,它可以成功構建。 一個問題出現時,我建立使用MSBuild的同一項目,錯誤如下:error LNK2026: module unsafe for SAFESEH image如何使用MSBuild命令行設置SAFESEH鏈接器選項

生成命令: "C:\Program Files (x86)\MSBuild\12.0\bin\MSBuild.exe" TI.sln /t:ReBuild /p:configuration=Release /p:Platform="Win32" /p:ToolVersion="12.0" /p:SAFESEH="NO"

請建議我一個解決方案

回答

0

/SAFESEH:在項目設置NO顯示的是與傳遞名爲SAFESEH的msbuild property並將其設置爲「NO」非常不同:/ SAFESEH是鏈接器命令行選項,並且與msbuild屬性沒有直接關係。相反,在一個MSBuild項目文件中的鏈接選項在ItemDefinitionGroup稱爲鏈接,所以如果你在一個文本編輯器打開該文件,你會看到類似

<ItemDefinitionGroup> 
    <Link> 
    <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> 
    </Link> 
</ItemDefinitionGroup> 

現在規定,如果你的項目沒有建立一個沒有SAFESEH也會唱關閉,我不明白爲什麼你不會在項目設置中永久配置它。它還具有從VS和命令行構建而不需要額外配置的好處。

如果由於某種原因,您不能這樣做,有幾個選項。第一個是基本相同,我的答案question如何通過命令行設置編譯器選項:創建一個文件,例如c:\ nosafeseh.props,含

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <ItemDefinitionGroup> 
    <Link> 
     <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> 
    </Link> 
    </ItemDefinitionGroup> 
</Project> 

然後把它通過調用使用

msbuild TI.sln /p:ForceImportBeforeCppTargets=c:\nosafeseh.props 

另一種選擇是將一個屬性「轉化」爲ItemDefinitionGroup條目。使用文本編輯器打開項目文件並添加這些行,在同一位置VS會把連接選項,用'前行後容易右:

<ItemDefinitionGroup> 
    <Link> 
    <ImageHasSafeExceptionHandlers Conditon="'$(SafeSeh)'!='">$(SafeSeh)</ImageHasSafeExceptionHandlers> 
    </Link> 
</ItemDefinitionGroup> 

這ImageHasSafeExceptionHandlers的值設置爲值名爲SafeSeh的屬性(這是一個任意名稱,您可以選擇任何您想要的),並且只有在該屬性被定義並且具有值的情況下。因此,將其設爲false,您可以致電

msbuild TI.sln /p:SafeSeh=False 
+0

非常感謝。 msbuild TI.sln /p:ForceImportBeforeCppTargets=c:\nosafeseh.props爲我工作。 –