首页 > 解决方案 > 静态编译的纯标准 C++ 程序是否可移植提供在同一架构上运行?

问题描述

当一个程序被递归静态编译时(假设所有链接的库都允许静态编译并且在它们的代码中是某种平台独立的,我知道这是可能的,因为我设法从 Ubuntu 静态编译 nano 以在 x86 Android 上运行并且它可以工作,因为它没有链接到系统库),假设它是独立的真的安全吗?也就是说,它是否需要平台上的其他任何东西(即 Linux、Windows、...等)?我怀疑答案是肯定的。所以相应地...

为简单起见,如果我采用此程序(无依赖关系):

int main(){
      return 0;
}

我可以轻松地静态编译它(因为它显然没有依赖项)并且应该生成在底层架构(比如 x86 架构)上运行的本机代码。

我知道有些包装器会传递环境变量和其他因平台而异的东西(例如 Windows exe 或 Linux 可执行文件)。

将包装器放在一边,问题是:如果我在 Linux 上使用 GCC 静态编译前面的程序,理论上我可以在 Windows 上运行它吗?

回到包装器,如果我知道如何将包装器从 Windows 转换为 Linux,反之亦然,我是否需要重新编译程序才能将其从一个转移到另一个?

标签: c++compilationportability

解决方案


您熟悉的普通用户程序嵌入在可执行文件格式中。将程序从此类文件加载到内存中需要依赖于所使用的特定格式的操作系统服务。

加载后,程序使用对操作系统的请求来执行基本操作,例如读取输入、写入输出和终止程序。这些不能内置到程序中,因为普通用户程序无权访问实现它们所需的硬件功能。

当然可以编写不依赖于操作系统的软件。一个例子是操作系统本身:它们提供所有自己的功能。但是,它们必须在裸硬件(或模仿它的虚拟环境)上执行,并且必须构建为由硬件的引导加载程序加载。


推荐阅读