pan*_*nzi 6 c linux macos clang cross-compiling
Linux 下 Mac 的交叉编译是一个主要的 PITA。要设置交叉编译,您需要一个 Apple 开发人员帐户、XCode 的 SDK 等。我尝试过,但无法让它工作。无论如何,似乎所有可用的说明都已过时。
但我要编译的程序只是一个小型 shell 工具,只需要一个标准 C 库(最好是静态链接的 glibc)。无需 Mac 框架或 Objective-C。在 Windows 上编译这样的二进制文件很容易,但在 OS X 上就不那么容易了。看起来几乎所有缺少的都是链接部分,因为你可以像这样构建 mach-o 对象文件:
clang -target i386-apple-darwin-macho hello_world.c -o hello_world.o -c
但当然事情没那么简单,因为这会产生一个错误:
echo $'#ifdef __linux__\n#error "thinks it\'s for linux"\n#endif'| \
    clang -x c - -o /dev/null -c
有没有办法在 Linux 下使用未打补丁的 clang 为 Mac OS X 编译 mach-o 对象?那么有没有一种方法可以将这样的目标文件与 Mac 的静态 glibc 链接起来,以便它在 OS X 下运行?我从哪里得到这样的 glibc (我想我必须自己编译它)?
我的OSXCross项目可能就是您正在寻找的。
有没有办法在 Linux 下使用未打补丁的 clang 为 Mac OS X 编译 mach-o 对象?
是的。Clang 默认是一个交叉编译器。但是,您还需要 cctools/ld64 和 Mac OS X SDK。
那么有没有一种方法可以将这样的目标文件与 Mac 的静态 glibc 链接起来,以便它在 OS X 下运行?
Mac OS X 没有 glibc,只是Libc在那里调用它。无需静态链接它。
我从哪里得到这样的 glibc (我想我必须自己编译它)?
您需要获取 Mac OS X SDK,没有其他办法。即使您能够Libc手动构建,您仍然缺少许多必需的库。
我知道 Mac OS X 不支持 glibc。
Mac OS X 没有 glibc。
...但我编写的代码是针对这一点的。例如,我使用 PRIuPTR (%zu) 等,Mac 的 libc 支持吗?
是的。AFAIK %zuprintf 说明符适用于除 Windows 之外的任何地方。
这就是我所担心的。上次我尝试过,非常麻烦,无法运行。
获取免费的 Apple 开发者帐户,然后您可以通过https://developer.apple.com/downloads/index.action下载 Xcode 。
完成后,请按照 SDK 打包说明进行操作。
什么图书馆?libc 应该只需要进行系统调用,而不需要使用其他库。
不。
$ otool -L /usr/lib/libc.dylib       
libc.dylib (architecture x86_64):
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
        /usr/lib/system/libcache.dylib (compatibility version 1.0.0, current version 69.0.0)
        /usr/lib/system/libcommonCrypto.dylib (compatibility version 1.0.0, current version 60061.0.0)
        /usr/lib/system/libcompiler_rt.dylib (compatibility version 1.0.0, current version 35.0.0)
        /usr/lib/system/libcopyfile.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/system/libcorecrypto.dylib (compatibility version 1.0.0, current version 233.1.2)
        /usr/lib/system/libdispatch.dylib (compatibility version 1.0.0, current version 442.1.4)
        /usr/lib/system/libdyld.dylib (compatibility version 1.0.0, current version 353.2.1)
        /usr/lib/system/libkeymgr.dylib (compatibility version 1.0.0, current version 28.0.0)
        /usr/lib/system/liblaunch.dylib (compatibility version 1.0.0, current version 559.20.9)
        /usr/lib/system/libmacho.dylib (compatibility version 1.0.0, current version 862.0.0)
[And so on...]
如果我能给你一个好的建议,那就不要尝试Libc手工构建。这是(几乎)不可能做到的。上次我尝试了很多标头丢失,我什至无法通过 opensource.apple.com 找到它们。
这只是浪费时间。
到目前为止,C 库并不是 OS X 所需的全部,许多库依赖于(闭源)框架、libc++,...