在x64上构建VC ++项目,无法在x86上执行

时间:2011-04-06 17:54:31

标签: .net visual-studio-2010 visual-c++ msbuild

我有一个非托管VC ++项目,我可以为x86和x64目标构建。它由为任何CPU编译的.NET程序使用。这是在VS2010上,但是当使用VS2008和vcbuild构建解决方案时,我遇到了同样的问题。

以下是构建脚本中的构建命令:

msbuild .\Project.vcxproj /t:Build /p:PlatformToolset=v100 /p:Configuration=Release /p:Platform=%platform%

如果在x86机器上构建,使用%platform%= Win32,一切都会构建并执行正常

如果使用%platform%= x64在x64计算机上构建,则所有内容都会构建并执行正常。

但是,如果我在x64机器上构建,使用%platform%= Win32,它会成功构建,没有错误。但是当我将那些所谓的x86二进制文件复制到x86机器时,它们会导致以下错误:

System.Runtime.InteropServices.SEHException was caught
  Message=External component has thrown an exception.

将该错误追溯回C ++ dll,它在这一行失败了:

if ( FAILED( g_Connection.CreateInstance( _T("ADODB.Connection") ) ) )
    ThrowException(_T("Cannot create connection."));

我查看了我的.vcxproj文件,但是一切看起来都是正确的。没有导入的属性文件或自定义构建任务或类似的东西。

这导致了问题,因为我们正在尝试使用单个x64构建服务器为两个平台创建构建。我们当前的解决方法涉及在两台不同的机器上预构建C ++ dll。

1 个答案:

答案 0 :(得分:0)

我将这个问题追溯到这个明确隐藏在其中一个头文件中的行:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")

当在x64机器上构建时,无论构建目标平台如何,它总是将x86 dll与x64版本的msdado15.dll链接起来。

我通过将两个平台的ADO文件复制到我的项目目录中并更新项目和标题来解决它:

#import "msado15.dll" no_namespace rename("EOF","EndOfFile")

.vcxproj文件:(仅显示相关行)

<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <AdditionalIncludeDirectories>.\ado\Win32;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <AdditionalIncludeDirectories>.\ado\x64;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
</ItemDefinitionGroup>