【问题标题】:Build VC++ project on x64, unable to execute on x86在 x64 上构建 VC++ 项目,无法在 x86 上执行
【发布时间】:2011-04-06 17:54:31
【问题描述】:

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

这是我的构建脚本中的构建命令:

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

如果在 x86 机器上构建,%platform%=Win32,一切构建和执行都很好

如果在 x64 机器上构建,使用 %platform%=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。

【问题讨论】:

  • 能否发布在 x86 机器上运行时遇到的运行时错误?
  • “它们无法加载”,显然。
  • 仔细查看后,它抛出了 SEHException,因此看起来 C++ dll 正在正确加载,但在创建对象时抛出了异常。我认为这是一个依赖问题,而不是 C++ dll 本身的问题。

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


【解决方案1】:

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

#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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多