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

Ami*_*yan 16 c c++ linux

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

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

我想分发我的二进制应用程序而不是分发源代码.

Dav*_*rtz 36

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

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

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

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

  4. 静态链接.

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

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

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

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

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