2017-02-27 98 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为我工作。 –