【问题标题】:Cross compile simple standard C program on Linux for Mac在 Linux for Mac 上交叉编译简单的标准 C 程序
【发布时间】:2015-06-07 00:48:26
【问题描述】:

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(我想我必须自己编译它)?

【问题讨论】:

    标签: c linux macos clang cross-compiling


    【解决方案1】:

    我的OSXCross 项目可能就是您要找的。​​p>

    有没有办法在 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++、...

    【讨论】:

    • 我知道 Mac OS X 不提供 glibc,但我针对它编写代码。例如。我使用 PRIuPTR (%zu) 等,Mac 的 libc 支持吗? “你需要获得 Mac OS X SDK,没有办法绕过它。”这就是我所害怕的。上次我尝试它非常繁琐,我无法让它工作。 “即使您设法手动构建 Libc,您仍然会缺少很多必需的库。”有哪些图书馆?一个 libc 应该只需要进行系统调用而不使用其他库。
    • @panzi:更新了我的答案。
    • 这出乎意料,因为在 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 编写它并为非 Linux 使用 py2exe/py2dmg(或它叫什么)。
    猜你喜欢
    • 2021-03-04
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2022-01-03
    • 2017-05-24
    相关资源
    最近更新 更多