在Linux for Mac上交叉编译简单的标准C程序

时间:2015-06-07 00:48:27

标签: 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(我想我必须以某种方式自己编译)?

1 个答案:

答案 0 :(得分:2)

我的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 %zu printf说明符适用于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 ++,...