cmake 交叉编译有大佬懂吗?

78 天前
 cohen121

c++新手,之前写 java 和 go 的。目前使用 cmake + vcpkg 在 Linux 开发。我现在想在在 Linux 环境生产 Windows/mac/linux 等操作系统下的可执行文件。可以完成吗? 现在只考虑最简单一个程序 hello world, 没有第三方依赖。如何操作。。。

3500 次点击
所在节点    C++
21 条回复
star9029
78 天前
MrKrabs
78 天前
可以用 zig
tinytoadd
78 天前
可以找一些流行的开源跨平台项目看看,打开 github workflow 看看他们是如何构建和分发的
qfly
78 天前
可以,使用 mingw 交叉编译,先编译工具链 https://github.com/Zeranoe/mingw-w64-build ,。最终 app 最好做成静态链接。支持 cmake 以及 make 文件的项目。但涉及的所有 lib 都得要交叉编译。
qfly
78 天前
关于 Mac 。有差不多现成的。但大的框架比如 qt ,需要很多 patch ,且不支持全部组件,特别是开源版本的。qt5 和 qt6 都支持。建议参考 osxcross 基本你要的都有,支持 arm 和 Intel ,c++交叉编译器 选 clang ,不要用 GCC ,否则超多坑。其他 Linux 下签名工具打包工具都有。但还是需要一个 Mac 测试。
0o0O0o0O0o
78 天前
tool2dx
78 天前
完不成,mac 我都是用 ssh 编译的,就算这样还是很难。

安卓倒是容易,那是因为 google 有跨平台的工具链,而苹果没有。
yaott2020
78 天前
楼主要不要试试看 Rust (勾引
jinliming2
78 天前
写过 Go 的话,Go 本身不就是可以直接跨平台编译吗?甚至简单到只要指定个环境变量就行了。但仅限于纯 Go 代码,没有 C 依赖的。
coderluan
78 天前
可以但是不推荐,因为没有办法同时交叉编译 Linux 和 Mac 平台的方案,也就是你得用两套,Windows 用 mingw ,Linux 用 zig ,然后出了问题新手大概率是解决不了的,真心不如用 cmake+clang 三个平台分别编译。
ai277014717
78 天前
hello world 依赖 libc 所以你做要的就是在 linux 下找到所有平台的 libc 就行了。
xinge666
78 天前
Go 可以直接交叉编译,C++的话得有对应的工具链,比如编译 win 下就用 mingw ,macOS 就没办法了。如果上 GitHub 的话,可以直接用 Action 编译多平台的二进制。
tuiL2
78 天前
cmake 只是个辅助编译的工具。你真正需要解决的是编译器的问题
wkla
78 天前
可以试试 github cmake action ,有个 cmake-multi-platform.yml 的跨平台编译。然后在 ci 里获取编译产物。https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml
wnpllrzodiac
78 天前
zig 好像还这个可以。不过估计问题还是有,没有原生的好用。win ,mac 最好还是在原生的上面编译。linux 倒是可以用 docker 。总之 linux 的各种架构都可以在 docker 里交叉编译。
ecnelises
78 天前
C/C++的交叉编译,需要的无非是工具链(编译器、链接器、头文件和库)。

Clang 内置交叉编译,意思是 Clang 自己的源码支持平台 A-Z ,所以只要 Clang 本身被构建的时候勾上了对某平台(比如 aarch64 )支持就没问题,但通常为了缩小体积,各种包管理里的 Clang 只会带 Host 架构支持,比如你是 x86 的机器,上面的 Clang 可能就只能编译到 x86 。所以用 Clang 的话需要搞一个支持你想要的目标平台的版本。GCC 定得更死一点,一个 GCC 只能支持一类目标平台,所以你得装一个特定的交叉编译 GCC (一般可执行文件名会带前缀),比如 gcc-mingw-w64 。

头文件和库,Linux 和 BSD 这类开源系统一般很容易搞到全套,Windows 注意下分 mingw 和 msvc 两套,macOS 也能下到。链接器麻烦一些,从 Linux 交叉编译基本只能用 GNU ld 或者 lld ,Windows 和 macOS 的 link.exe 和 ld64 没有其他平台的版本。总之你可以去参考 zig cc 包里的依赖,甚至直接用它就可以,从它交叉编译出 macOS 和 Windows 的 hello world 就是一分钟的事。

CMake 的配置可以参考下官方文档,核心也基本就是一些编译选项: https://cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html
passive
78 天前
用不用 cmake 都能搞,避开 configure 阶段通过 exe 生成的代码就行。

Windows 用 mingw64 几乎没问题。Fedora 的包最全。走个 wine 还能 make test 。

Mac 用 osxcross 坑很多,动手能力差的建议放弃。
jchnxu
78 天前
我用 mac 研究过一点。。结论是直接把不同的系统电脑买/借了最快,太麻烦了
sir283
78 天前
cmake + clang 或者 gcc 都可以,可以参考 qt 的跨平台方案跟 pyinstaller 的实现原理,也可以参考 termux 的 build-packages 脚本
snylonue
77 天前
借楼问一下如果有依赖在 windows 下只支持 msvc 要怎么交叉编译

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

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

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

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

© 2021 V2EX