【问题标题】:Trying to understand the interaction between compiler and linker for multi-platform compilation试图了解多平台编译的编译器和链接器之间的交互
【发布时间】:2011-09-20 09:47:45
【问题描述】:

我有一个 C++ Visual Studio 项目,我正在尝试为 x86 和 x64 架构进行编译。我在谷歌上搜索并找到了很多关于如何做到这一点的信息,而且它似乎有效,但它让我对幕后发生的事情深感困惑。

显然,设置的唯一区别是 linker 命令行标志中的一个开关(准确地说,它是 /MACHINE 标志)。

如果是这样,那么编译的目标文件必须是平台独立——这与我一直认为的完全相反,因为目标文件应该是机器代码序列,而这些机器代码序列又应该是平台依赖

所以,我的问题是:构建过程的哪些部分不符合我的预期?

感谢您的时间和智慧!

迈克尔

【问题讨论】:

  • 添加了 Visual C++ 标记,因为 GCC 确实 生成依赖于体系结构的目标文件。

标签: visual-c++ compilation linker platform


【解决方案1】:

针对 32 位 x86 进行编译时,Visual Studio 使用编译器 \Program Files\Microsoft Visual Studio 10.0\VC\bin\cl.exe。为 64 位 x86 编译时,Visual Studio 使用编译器 \Program Files\Microsoft Visual Studio 10.0\VC\bin\amd64\cl.exe。第一个编译器生成 32 位目标文件,第二个编译器生成 64 位目标文件。这可以通过在目标文件上运行 dumpbin.exe 来查看它们指定的体系结构。

编译器调用保持不变(或多或少)——改变的是在构建之前设置的可执行 $PATH。通过将 PATH 指向 32 位或 64 位目录,它会偷偷更改为构建项目而运行的整个程序集。您可以通过查看项目属性 > 配置属性 > VC++ 目录 > 可执行目录,然后单击“编辑”来看到这一点。在“继承值”框中,您将看到当前配置和平台的路径。

【讨论】:

  • 谢谢,这似乎恢复了我的理智,事实上,我发现了不同的目录设置。在我看来,来自 Unix 背景很不直观,但我想我可以看到它背后的想法。
猜你喜欢
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2010-11-28
相关资源
最近更新 更多