V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qdwang
V2EX  ›  macOS

关于 M1 芯片 MacOS 下 C++编译的问题

  •  
  •   qdwang · 2021-04-20 08:43:18 +08:00 · 4191 次点击
    这是一个创建于 1342 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 c++库,需要跨平台使用,但是目前手上没有 mac 系统的机器。

    所以请问一下大家,M1 芯片的 MacOS 下的 xcode,可否交叉编译出 intel 芯片 mac 系统的二进制文件呢?

    如果可以的话,只要买一个 M1 的 mac 机器就行了。

    谢谢。

    15 条回复    2021-05-25 22:49:45 +08:00
    huage2580
        1
    huage2580  
       2021-04-20 09:05:17 +08:00
    我也有此疑惑,一直没升级 m1
    qdwang
        2
    qdwang  
    OP
       2021-04-20 09:09:28 +08:00
    @huage2580 恩恩 希望有使用过的朋友能说一下
    missdeer
        3
    missdeer  
       2021-04-20 09:11:36 +08:00
    简单的程序是可以的,clang 支持命令行参数--target,比如`clang main.cpp -lc++ -o test --target=x86_64-apple-darwin`,生成的 test 文件用 file 命令看一下,就能发现是`Mach-O 64-bit executable x86_64`,如果不加--target 参数,默认生成的文件则是`Mach-O 64-bit executable arm64`

    不过大问题是,大程序依赖的一些库并不一定默认就有 2 种 CPU 架构的版本,可能需要自己去补齐
    agagega
        4
    agagega  
       2021-04-20 09:16:53 +08:00
    刚刚试了下,可以。
    clang -target x86_64-apple-darwin-macho
    qdwang
        5
    qdwang  
    OP
       2021-04-20 09:31:32 +08:00
    @missdeer 十分感谢,那个库没有另外的依赖,看起来应该没问题了。
    qdwang
        6
    qdwang  
    OP
       2021-04-20 09:31:56 +08:00
    @agagega 十分感谢测试
    huage2580
        7
    huage2580  
       2021-04-20 09:49:07 +08:00
    @missdeer
    @agagega
    有办法可以编译出含两份架构的通用包吗,就是 universal library,还是不同架构得不同的
    xuegy
        8
    xuegy  
       2021-04-20 09:54:37 +08:00 via iPhone
    代码本身不太可能出现问题,依赖库可能会出大问题。
    agagega
        9
    agagega  
       2021-04-20 10:49:35 +08:00 via iPhone
    @huage2580
    参考 https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary
    clang 本身一次是只能编译到一个平台的,命令行下面要用 lipo 这个工具把两个版本的二进制文件合并到一起
    qdwang
        10
    qdwang  
    OP
       2021-04-20 10:57:20 +08:00
    @agagega 原来还可以这样,不错,谢谢拉
    MrKrabs
        11
    MrKrabs  
       2021-04-20 15:35:48 +08:00
    clang -arch arm64 -arch x86_64 test.c
    lipo -info a.out
    Architectures in the fat file: a.out are: x86_64 arm64
    SpringHack
        12
    SpringHack  
       2021-04-20 19:12:51 +08:00
    亲测可以,在 m1 下编译了一遍 x86_64 的 chromium,就是这感人的速度差点当场去世
    qdwang
        13
    qdwang  
    OP
       2021-04-20 22:45:38 +08:00
    @SpringHack 太棒了,非常感谢
    qdwang
        14
    qdwang  
    OP
       2021-04-20 22:46:21 +08:00
    @MrKrabs 看来输出可以直接合并成一个?
    baiyunheitu
        15
    baiyunheitu  
       2021-05-25 22:49:45 +08:00
    @SpringHack 请问一下完整编译一次大约需要多久。目前我用 10700 耗时大约是 2h 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   880 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.