使用gcc编译来自终端的C程序,用于较旧的OS X版本

时间:2014-03-12 20:22:59

标签: c gcc terminal osx-mountain-lion osx-mavericks

我在OS X 10.9.2(Mavericks)上编写了一段C代码,并通过链接所需的库(如-lm -lfftw3等)从终端使用gcc编译器对其进行编译。它在我的计算机上工作正常,另一个运行相同的操作系统(也有所需的库),但当我尝试在运行OS X 10.8(Mountain Lion)的另一台计算机上运行可执行文件时,它不起作用。我没有尝试在运行OS X 10.8(Mountain Lion)的计算机上重新编译,因为它没有安装所需的库。如何仅使用计算机上的终端(运行OS X 10.9.2(Mavericks))创建新的可执行文件,以便它可以在任何以前版本的操作系统上运行,而这些操作系统可能永远不会安装所需的库?

感谢。

1 个答案:

答案 0 :(得分:1)

这个问题有三种方法:

  • 将所有依赖项静态链接到二进制文件中。
    • 这将包括最终应用程序中的库副本,使其更大,但是自包含。
  • 创建依赖项的动态构建并将它们部署在目标系统上。
    • libm(数学库)通常存在于所有系统中,因此就像libfftw3和其他需要重建的库一样。
    • 这可以通过构建源代码或使用macports <www.macports.org>
    • 安装所需的库来实现。
  • 为远程端提供备用环境以运行应用程序(即:在其中运行Mavericks的虚拟机)。

修改

为响应您的情况,您可以强制静态链接XCode目标的依赖项,如果是libfftw3,则替换以下行:

-lfftw3

使用:

-l/full/path/to/libfftw3.a

对目标所链接的所有库重复此操作,然后进行设置。最终的应用程序二进制文件可能在文件大小上要大得多,但是完全自包含。

<强>参考文献:


  1. 强制链接到Xcode目标的库的静态链接?,已访问2014-03-14,<https://stackoverflow.com/questions/458805/force-static-linking-of-library-linked-to-xcode-target>
  2. 为以前的OS X版本编译C程序,访问2014-03-14,<https://stackoverflow.com/questions/22391848/compiling-a-c-program-for-previous-os-x-version>