首页 > 解决方案 > 在另一台机器上为特定机器编译

问题描述

这实际上可能是一个荒谬的问题,但是关于编译器/编译有很多我不明白的地方。我知道交叉编译、交叉本机编译等的概念。但是,我不知道适用于我的场景的内容:

我想做的就是这个。

假设我有两台具有不同硬件的计算机AB

假设我确定的AB之间的唯一相似之处是:

  1. 两者都有一些能够进行 64 位计算的英特尔处理器。
  2. 两者都运行 Windows 10,因此可以通过其他方式(例如 WSL)访问 Linux。
  3. AB都有编译(任意)代码所需的所有程序。

假设我还拥有对A 的管理访问权限(即我可以做/运行/安装任何我想做的事情/在它上面)。这不是B的情况。

此外,(这可能无关紧要),可以物理访问A (如果需要,可以远程访问)。B只能远程访问(通过 SSH、RDP 等)


现在说我想用一些编译器编译一些专门为A上的硬件优化的任意复杂的 C/C++ 代码。例如,我相信如果我A上使用可以实现这一点。-march=nativegcc

但是,假设A是特殊的,它的处理能力不能“浪费”在编译上,因为它有更重要的任务要做。换句话说,我不想 A上经历编译的时间和功耗过程。

相反,我想B上为A 做这个编译。

如何获得与A"-march=native"上完成的编译等效的最终结果(如果使用)?换句话说,如何B上编译针对A上硬件优化的代码? gcc

对于gcc,是否像A上找到等效标志然后在-march=native B上运行执行一样简单?如果是这样,有没有办法简化这个过程,如果没有,怎么做(如果有的话?)。

可以使用gcc 以外的编译器(即 Visual C++ 和 Intel C++ 编译器)完成该过程吗?

标签: gcccompilationcross-compilingcompiler-optimizationicc

解决方案


假设您知道目标服务器的架构(在您的情况下为 A),只需将其作为 -march 传递给 B 上的 gcc。

例子

建筑是天空湖

等等 B 使用

gcc -march=skylake ..... (rest of the flags)

如果 A 是 ryzen

gcc -march=znver1 ..... (rest of the flags)

然后将文件从B复制到A。


推荐阅读