【问题标题】:Compile a C program from terminal using gcc for older OS X version使用 gcc 从终端编译 C 程序以获得旧 OS X 版本
【发布时间】:2014-04-17 06:19:10
【问题描述】:

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

谢谢。

【问题讨论】:

  • 静态链接它,因此任何必要的外部库都成为二进制文件的一部分。
  • 您必须确保库在另一台计算机上 - 从您的问题来看,我会说这不是 OSX 版本的问题
  • @Marc B:你能给我举个例子说明我应该怎么做吗(静态链接)?谢谢
  • gcc -static 创建静态二进制文件。它可能不起作用,有时您实际上并没有获得库的静态版本。

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


【解决方案1】:

解决这个问题有三种方法:

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

编辑:

响应您的要求,您可以强制静态链接 XCode 目标的依赖项,在 libfftw3 的情况下,通过替换以下行:

-lfftw3

与:

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

对您的目标链接所针对的所有库重复此操作,然后您就设置好了。最终的应用程序二进制文件可能会更大,但完全独立。

参考资料:


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

【讨论】:

  • 能否请您指向一个链接,该链接指示我如何能够在我的最终应用程序中包含库的副本?我的目标是在我的计算机上创建一个可执行文件(或多个可执行文件,如果需要),准备好在其他可能运行旧版 Mac OS 并且没有 libfftw3 和 libaiff(另外两个库)的计算机上运行我正在使用)已安装。谢谢。
  • 你是如何构建你的应用程序的?是严格从命令行还是使用 makefile(如果是,GNU make、AutoMake、CMake)还是在 IDE(Eclipse、XCode 等)中?
  • 请查看我发布的这个替代问题。我有你正在寻找的答案。 stackoverflow.com/questions/22391848/…
  • 感谢您的回复。我会试试这个。谢谢!
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 2011-02-20
  • 2014-12-12
  • 1970-01-01
  • 2015-05-17
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多