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

标签 c linux unix gcc

我用c编写了一个程序代码,在gcc编译器中编译并执行。我想共享程序的可执行文件而不共享实际的源代码。有什么方法可以在不泄露实际源代码的情况下共享我的程序,以便可执行文件可以在其他带有 gcc 编译器的计算机上运行??

最佳答案

Is there any way to share my program without revealing actual source code so that executable file could run on other computers with gcc compilers?

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,但您肯定很了解这样的要求。

关于c - 如何在其他笔记本电脑上运行在我的笔记本电脑gcc环境中创建的可执行文件a.out?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41022219/

相关文章:

c++ - 使用 strcpy 抛出 "stack smashing detected"错误

c - 将字符串解析为参数时出现额外的空字符串

java - 在 linux 中查找路径条目

sql - 具有多行和单行的文本文件中的行数

c - 正确使用 malloc

c - Ubuntu 15.10(内核 4.2): Hello world kernel module makefile error

创建双向通信 fifo

linux - docker 运行失败

c - 使用 getchar() 和 select() 从非阻塞 IO 获取多个字符时出现奇怪的 C 行为

c++ - 如何等待命名管道的另一端打开?