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

2021-04-20 08:43:18 +08:00
 qdwang

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

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

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

谢谢。

3881 次点击
所在节点    macOS
15 条回复
huage2580
2021-04-20 09:05:17 +08:00
我也有此疑惑,一直没升级 m1
qdwang
2021-04-20 09:09:28 +08:00
@huage2580 恩恩 希望有使用过的朋友能说一下
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
2021-04-20 09:16:53 +08:00
刚刚试了下,可以。
clang -target x86_64-apple-darwin-macho
qdwang
2021-04-20 09:31:32 +08:00
@missdeer 十分感谢,那个库没有另外的依赖,看起来应该没问题了。
qdwang
2021-04-20 09:31:56 +08:00
@agagega 十分感谢测试
huage2580
2021-04-20 09:49:07 +08:00
@missdeer
@agagega
有办法可以编译出含两份架构的通用包吗,就是 universal library,还是不同架构得不同的
xuegy
2021-04-20 09:54:37 +08:00
代码本身不太可能出现问题,依赖库可能会出大问题。
agagega
2021-04-20 10:49:35 +08:00
@huage2580
参考 https://developer.apple.com/documentation/apple-silicon/building-a-universal-macos-binary
clang 本身一次是只能编译到一个平台的,命令行下面要用 lipo 这个工具把两个版本的二进制文件合并到一起
qdwang
2021-04-20 10:57:20 +08:00
@agagega 原来还可以这样,不错,谢谢拉
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
2021-04-20 19:12:51 +08:00
亲测可以,在 m1 下编译了一遍 x86_64 的 chromium,就是这感人的速度差点当场去世
qdwang
2021-04-20 22:45:38 +08:00
@SpringHack 太棒了,非常感谢
qdwang
2021-04-20 22:46:21 +08:00
@MrKrabs 看来输出可以直接合并成一个?
baiyunheitu
2021-05-25 22:49:45 +08:00
@SpringHack 请问一下完整编译一次大约需要多久。目前我用 10700 耗时大约是 2h 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/771793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX