是否可以编译在所有Linux发行版中执行而无需重新编译的C / C ++源代码?

时间:2011-09-18 11:27:46

标签: c++ c linux

是否可以编译在所有Linux发行版中执行而无需重新编译的C / C ++源代码?

如果答案是肯定的,我可以使用任何外部(非标准C / C ++)库吗?

我希望分发我的二进制应用程序,而不是分发源代码。

3 个答案:

答案 0 :(得分:36)

不,您无法编译在所有Linux发行版中执行的可执行文件。但是,您可以编译一个可执行程序,该可执行程序适用于人们倾向于关注的大多数发行版。

  1. 编译32位。编译您愿意支持的最低CPU级别。

  2. 构建自己的glibc版本。使用--enable-kernel选项设置您愿意支持的最低内核版本。

  3. 编译您计划自己使用的所有其他库。使用glibc构建的头文件和您选择的CPU /编译器标志。

  4. 静态链接。

  5. 对于您无法静态链接的任何内容(例如,如果您需要访问系统的默认名称解析或需要PAM),您必须设计自己的帮助程序和API。将源发布到帮助程序进程并让它们(或安装程序)编译它。

  6. 在您需要支持的所有平台上进行彻底测试。

  7. 如果调用无法使用此机制的函数,则可能需要调整某些库。其中包括dlopengethostbynameiconv_open等。 (这些类型的功能基本上依赖于动态链接。请参阅上面的步骤5.当您链接这些功能时,您会收到警告。)

    此外,如果您不小心,时区往往会中断,因为您的代码可能无法理解系统的区域格式或区域文件位置。 (你不会得到这些警告。它只是不起作用。)

    大多数执行此操作的人正在构建支持最少的CPU是Pentium 4,支持的最低内核版本是2.6.0。

答案 1 :(得分:4)

安装之间存在两个不同之处。建筑和图书馆。

  1. 不能直接使用一个用于不同体系结构的二进制文件;尝试在一个文件(fatelf)中使用多个拱的二进制文件,但它没有得到广泛使用,也不太可能获得动力。所以至少你必须为ia32,amd64,arm,...分发单独的二进制文件(尽管不是所有的amd64发行版都有内核编译,但支持运行ia32代码)

  2. 分发包含不同版本的库。只要API没有改变,你就可以了,你可以链接到那个库。一些库确保主要数量内的向内兼容性(因此GTK2.2应用程序将与GTK2.30 lib一起正常运行,但不一定反之亦然)。如果你想确定,你必须静态链接你使用的所有库,除了最基本的库(可能只有libc6,这是与发行版AFAIK的二进制兼容)。这可以增加二进制文件的大小,这是其中一个原因。虽然应用程序本身并不是特别丰富的功能,但Acrobat Reader下载量相对较大。

  3. c ++ ABI有一个过渡期,它在gcc 2.9和3(IIRC)之间发生了变化,但旧的ABI实际上只是在古代装置上。这对您来说不再适用,如果您静态链接,无论如何都是无关紧要的。

答案 2 :(得分:0)

一般没有。

有几个bariers。

不同的架构

虽然32位二进制文​​件将在x86_64系统上运行,但反之亦然。此外,还有很多ARM系统。

内核ABI

内核ABI变化非常缓慢,但它确实发生了变化,因此您无法真正支持所有可能的版本。请注意,在某些地方,内核2.2仍在使用中。

您可以做的是创建静态链接的二进制文件。这样的二进制文件将包括您的应用程序所依赖的所有库,它将适用于具有相同体系结构和相当类似内核版本的所有系统。