关于 M1 芯片 MacOS 下 C++编译的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qdwang
V2EX    macOS

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

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

    有一个 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     Solana     3031 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 00:26 PVG 08:26 LAX 17:26 JFK 20:26
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86