【问题标题】:How do I compile a 64-bit native C++ DLL in VS 2008?如何在 VS 2008 中编译 64 位本机 C++ DLL?
【发布时间】:2009-11-03 13:23:36
【问题描述】:

我正在尝试将本机 ATL C++ in-proc COM 服务器移植到 Visual Studio 2008 中的 64 位。我打开了配置管理器,添加了“x64”平台。现在我有 6 个配置 - 3 个用于 Win32 的编译和链接良好,3 个用于 x64 编译良好,但使链接器发出以下错误:

\Debug64\Objects\common.obj : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

我应该做些什么来消除这种情况?

UPD:已解决,问题源出乎意料地愚蠢,请参阅下面的答案。

【问题讨论】:

  • 您是否尝试过清理以确保使用正确的目标计算机重新编译所有 .obj 文件?
  • 是的,即使是干净的构建,问题仍然存在。

标签: c++ visual-studio visual-studio-2008 64-bit


【解决方案1】:

Visual Studio 安装过程中是否安装了“x64 compiler and tools”组件?

还要检查这些设置:(copied from msdn)

  • /MACHINE(指定目标平台)设置为 /MACHINE:IA64 或 /MACHINE:X64。

  • 寄存器输出关闭。有关详细信息,请参阅链接器属性页。

  • 目标环境设置为 /env x64 或 /env ia64。有关详细信息,请参阅 MIDL 属性页:常规。

  • 验证参数被清除并重置为默认值。有关详细信息,请参阅 MIDL 属性页:高级。

  • 如果在 Win32 项目配置中将调试信息格式设置为 /ZI,则在 64 位项目配置中将其设置为 /Zi。有关详细信息,请参阅 /Z7、/Zi、/ZI(调试信息格式)。

  • WIN32 的值被 WIN64 替换为 /D(预处理器定义)。

【讨论】:

  • Visual C++ 没有设置 x64 编译所需的所有内容。 IMO,最重要的点是第一点(在配置属性/链接器/高级中找到)和最后一点(在配置属性/C/C++/预处理器定义中找到)。
【解决方案2】:

确定 common.obj 的目标机器是 x86 吗?因为链接器告诉你它不是。 检查解决方案->属性->配置平台确实是x64,并在项目->属性->链接器->高级->目标机器中进行设置。并重建。

【讨论】:

  • 我究竟要检查什么以确保该 .obj 文件的目标机器是正确的?
  • 我提到的两件事你都试过了吗?顺便说一句,如果您想手动检查,请在文本或十六进制编辑器中打开文件并查找包含“/manifestdependency”或“processorArchitecture”的行,它会告诉它是为哪个平台编译的。或者更简单,如果让链接器发出映射文件,地址将全部为 64 位而不是 32 位。
  • 是的,有一个问题:/manifestdependency:"type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' 但是我该如何解决这个问题?
  • 是的,预处理器定义和链接器设置设置正确。而且我在项目的任何地方都没有使用 MIDL。
  • 在那种情况下:我一无所知;除非:你有每个文件的编译设置吗?在文本编辑器中打开您的 vcproj 文件并检查生成 common.obj 的文件是否有任何 块(我猜应该是 common.cpp)?
【解决方案3】:

一个常见问题是未能使用 Debug64 和 Release64 目录。确切的名称并不重要,但如果您最终将 32 位和 64 位 .objs、.libs 或 .dlls 混合在一个目录中,链接器就会出现问题。

确定这是否有贡献的一种快速方法是进行干净的构建。如果链接问题没有消失,那么中间二进制文件的混合不是原因

【讨论】:

    【解决方案4】:

    嗯,真正的原因非常简单。我们不使用 VS 附带的 .cmd 文件来设置环境变量,而是使用我们自己的等效 .cmd 文件。该文件为 32 位 cl.exe 设置了 %PATH% 变量,这正是使用 32 位编译器编译 C++ 源代码的原因。解决方案是使用 .cmd 进行 VS 附带的 x64 编译,或者适当地制作自定义 .cmd 文件设置 %PATH%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 2011-03-04
      • 2023-03-24
      相关资源
      最近更新 更多