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

github.com/jart/cosmopolitan

可以用 zig

可以找一些流行的开源跨平台项目看看,打开 github workflow 看看他们是如何构建和分发的

可以,使用 mingw 交叉编译,先编译工具链 github.com/Zeranoe/mingw-w64-build ,。最终 app 最好做成静态链接。支持 cmake 以及 make 文件的项目。但涉及的所有 lib 都得要交叉编译。

关于 Mac 。有差不多现成的。但大的框架比如 qt ,需要很多 patch ,且不支持全部组件,特别是开源版本的。qt5 和 qt6 都支持。建议参考 osxcross 基本你要的都有,支持 arm 和 Intel ,c++交叉编译器 选 clang ,不要用 GCC ,否则超多坑。其他 Linux 下签名工具打包工具都有。但还是需要一个 Mac 测试。

hello world 那就用 #2 说的 andrewkelley.me/post/zig-cc-powerful-drop-in-replacement-gcc-clang.html

完不成,mac 我都是用 ssh 编译的,就算这样还是很难。安卓倒是容易,那是因为 google 有跨平台的工具链,而苹果没有。

楼主要不要试试看 Rust (勾引

写过 Go 的话,Go 本身不就是可以直接跨平台编译吗?甚至简单到只要指定个环境变量就行了。但仅限于纯 Go 代码,没有 C 依赖的。

可以但是不推荐,因为没有办法同时交叉编译 Linux 和 Mac 平台的方案,也就是你得用两套,Windows 用 mingw ,Linux 用 zig ,然后出了问题新手大概率是解决不了的,真心不如用 cmake+clang 三个平台分别编译。

hello world 依赖 libc 所以你做要的就是在 linux 下找到所有平台的 libc 就行了。

Go 可以直接交叉编译,C++的话得有对应的工具链,比如编译 win 下就用 mingw ,macOS 就没办法了。如果上 GitHub 的话,可以直接用 Action 编译多平台的二进制。

cmake 只是个辅助编译的工具。你真正需要解决的是编译器的问题

可以试试 github cmake action ,有个 cmake-multi-platform.yml 的跨平台编译。然后在 ci 里获取编译产物。 github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml

zig 好像还这个可以。不过估计问题还是有,没有原生的好用。win ,mac 最好还是在原生的上面编译。linux 倒是可以用 docker 。总之 linux 的各种架构都可以在 docker 里交叉编译。

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 的配置可以参考下官方文档,核心也基本就是一些编译选项: cmake.org/cmake/help/book/mastering-cmake/chapter/Cross%20Compiling%20With%20CMake.html

用不用 cmake 都能搞,避开 configure 阶段通过 exe 生成的代码就行。Windows 用 mingw64 几乎没问题。Fedora 的包最全。走个 wine 还能 make test 。Mac 用 osxcross 坑很多,动手能力差的建议放弃。

我用 mac 研究过一点。。结论是直接把不同的系统电脑买/借了最快,太麻烦了

cmake + clang 或者 gcc 都可以,可以参考 qt 的跨平台方案跟 pyinstaller 的实现原理,也可以参考 termux 的 build-packages 脚本

借楼问一下如果有依赖在 windows 下只支持 msvc 要怎么交叉编译