如何在我的笔记本电脑gcc环境中运行在其他笔记本电脑中创建的可执行文件a.out?

时间:2016-12-07 16:12:51

标签: c linux unix gcc

我编写了一个用gcc编译器编译和执行的程序代码。我想在不共享实际源代码的情况下共享程序的可执行文件。有没有办法在不透露实际源代码的情况下共享我的程序,以便可执行文件可以在其他具有gcc编译器的计算机上运行?

2 个答案:

答案 0 :(得分:3)

  

有没有办法在不透露实际源代码的情况下共享我的程序,以便可执行文件可以在其他具有gcc编译器的计算机上运行?

TL; DR :是的,提供了比仅仅拥有GCC更大程度的相似性。只需将二进制文件和任何所需的辅助文件复制到兼容系统并运行即可。

更详细

在没有源代码的情况下分发已编译的二进制文件是很常见的,以便在除了构建这些二进制文件的机器之外的机器上执行。这种分发方式确实存在潜在的兼容性问题(如下所述),但源分发也是如此。从广义上讲,您只需将二进制文件和任何所需的支持文件安装(复制)到兼容系统上的适当位置并执行它们。这是大多数商业软件的分发方式。

架构依赖

编译的二进制文件当然特定于特定的硬件体系结构,或者在特定情况下特定于两个或更多个体系结构的小型预定集合(例如,旧的Mac通用二进制文件)。您将无法在硬件上运行二进制文件,与其构建方式不同,但"架构"与CPU模型完全不同。

例如,有很多CPU实现了x86_64架构。针对该架构的大多数程序都可以在任何此类CPU上运行。实际上,x86架构与x86_64类似,大多数为x86构建的程序也可以在x86_64上运行(但不是反之亦然)。可以引入更细粒度的硬件依赖性,但默认情况下通常不会这样做。

操作系统依赖性

此外,大多数二进制文件都是为在主机操作系统的上下文中运行而构建的。您将无法在操作系统上运行二进制文件,因为它与为其构建的操作系统差别太大。

例如,Linux二进制文件不会(直接)在Windows上运行。 Windows二进制文件不会(直接)在OS X上运行。等等。

图书馆依赖

此外,针对共享库构建的程序需要在运行时环境中提供每个所需共享库的兼容版本。这不一定必须与它构建的版本完全相同;这取决于库,使用哪些功能和数据,以及这些是否以及如何随时间发生变化。

您可以通过静态链接每个所需的库,包括C标准库,或通过分发共享库和二进制文件来回避此问题。然而,解决这个问题是相当普遍的,因此只支持二进制分发的所有可能环境的子集。

其他

其他潜在的兼容性问题确实存在,但是对于您自己编写并希望分发的程序,它们中的任何一个都不太可能会让您感到意外。例如,如果您在程序中使用nVidia CUDA,则可能需要nVidia GPU,但这样的要求肯定会为您所熟知。

答案 1 :(得分:1)

可执行文件通常特定于创建它们的环境/机器。即使涉及相同的处理器/硬件,也可能存在对库的依赖性,这可能会阻止可执行文件在其他计算机上运行。

仅使用"标准库的程序"并且它静态地链接所有库,不需要任何其他依赖(在某种意义上,它需要的所有代码都在二进制本身或OS系统库 - 系统本身的一部分 - 已经在系统上)。

您必须静态链接标准库。否则,只有在默认情况下在您的操作系统中安装了编译器标准库的版本时才会起作用(一般情况下,您不能依赖它)。