在x64上构建VC++项目,无法在x86上执行
问题描述:
我有一个可以为x86和x64目标构建的非托管VC++项目。它正在被任何CPU编译的.NET程序使用。这是在VS2010上,但当解决方案使用VS2008和vcbuild构建时,我遇到了同样的问题。在x64上构建VC++项目,无法在x86上执行
这里是我的构建脚本编译命令:
msbuild .\Project.vcxproj /t:Build /p:PlatformToolset=v100 /p:Configuration=Release /p:Platform=%platform%
如果在x86机器上生成,用%平台(%)= Win32中,一切都建立并执行罚款
如果在x64机器上建立,使用%platform%= x64,所有内容都会生成并执行正常。但是,如果我使用%platform%= Win32在x64机器上构建,那么它将成功构建而不会出错。但是,当我那些所谓-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。
答
我追踪的问题重新回到这条线巧妙地隐藏在头文件中的一个:
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","EndOfFile")
,将始终与msdado15.dll x64版本的链接DLL的x86,在x64机器上进行构建 - 无论构建目标平台。
我解决它通过两个平台的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>
您可以发布尝试在x86机器上运行时遇到的运行时错误吗? – Jacob 2011-04-06 17:56:34
“显然不能装载”。 – 2011-04-06 18:13:52
仔细一看,它抛出了一个SEHException,所以它看起来像C++的DLL正在被正确加载,但抛出一个异常,创建一个对象。我认为这是一个依赖性问题,而不是C++ dll本身的问题。 – 2011-04-06 18:19:01