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

6
在Linux下进行Mac的交叉编译非常麻烦。为了设置交叉编译,你需要一个苹果开发者账号、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

有没有办法使用未经修补的clang在Linux下编译Mac OS X的mach-o对象?然后是否有一种方法将这样的对象文件与Mac的静态glibc链接,以便在OS X下运行?我应该从哪里获取这样的glibc(我猜我必须自己编译它)?
1个回答

3

我的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。
但是我使用glibc编写代码。例如,我使用PRIuPTR(%zu)等,Mac的libc支持吗?
是的。据我所知,除了Windows之外,%zu printf格式说明符在任何地方都可以工作。
这就是我担心的。上次我尝试使用它非常麻烦,而且我无法让它工作。
获取免费的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++等。

我知道Mac OS X没有glibc,但我还是写了我的代码。例如,我使用PRIuPTR(%zu)等,那么Mac的libc支持吗?“你需要获取Mac OS X SDK,没有其他方法。”这正是我担心的。上次我尝试过,非常麻烦,而且我无法让它工作。“即使您设法手动构建Libc,仍然会缺少许多所需的库。”哪些库?libc只需要进行系统调用,而不使用其他库。 - panzi
@panzi:更新了我的答案。 - Thomas
这很意外,因为在Linux下它是这样的:$ ldd /lib64/libc.so.6↵ /lib64/ld-linux-x86-64.so.2 (0x0000003cf9600000)↵ linux-vdso.so.1 => (0x00007fff14f52000)而这已经比我预期的多一个了(但yum说ld-linux-x86-64.so.2已经包含在glibc软件包中了)。总之,对于一个小小的shell程序来说,这一切对我来说似乎都太复杂了。我可能应该用Python编写它,并且使用py2exe/py2dmg(或称为什么)来处理非Linux系统。 - panzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接