c++新手,之前写 java 和 go 的。目前使用 cmake + vcpkg 在 Linux 开发。我现在想在在 Linux 环境生产 Windows/mac/linux 等操作系统下的可执行文件。可以完成吗? 现在只考虑最简单一个程序 hello world, 没有第三方依赖。如何操作。。。
2
MrKrabs 37 天前
可以用 zig
|
3
tinytoadd 36 天前
可以找一些流行的开源跨平台项目看看,打开 github workflow 看看他们是如何构建和分发的
|
4
qfly 36 天前 via Android
可以,使用 mingw 交叉编译,先编译工具链 https://github.com/Zeranoe/mingw-w64-build ,。最终 app 最好做成静态链接。支持 cmake 以及 make 文件的项目。但涉及的所有 lib 都得要交叉编译。
|
5
qfly 36 天前 via Android
关于 Mac 。有差不多现成的。但大的框架比如 qt ,需要很多 patch ,且不支持全部组件,特别是开源版本的。qt5 和 qt6 都支持。建议参考 osxcross 基本你要的都有,支持 arm 和 Intel ,c++交叉编译器 选 clang ,不要用 GCC ,否则超多坑。其他 Linux 下签名工具打包工具都有。但还是需要一个 Mac 测试。
|
6
0o0O0o0O0o 36 天前 via iPhone
hello world 那就用 #2 说的
https://andrewkelley.me/post/zig-cc-powerful-drop-in-replacement-gcc-clang.html |
7
tool2dx 36 天前 via Android
完不成,mac 我都是用 ssh 编译的,就算这样还是很难。
安卓倒是容易,那是因为 google 有跨平台的工具链,而苹果没有。 |
8
yaott2020 36 天前 via Android 1
楼主要不要试试看 Rust (勾引
|
9
jinliming2 36 天前 via iPhone
写过 Go 的话,Go 本身不就是可以直接跨平台编译吗?甚至简单到只要指定个环境变量就行了。但仅限于纯 Go 代码,没有 C 依赖的。
|
10
coderluan 36 天前 1
可以但是不推荐,因为没有办法同时交叉编译 Linux 和 Mac 平台的方案,也就是你得用两套,Windows 用 mingw ,Linux 用 zig ,然后出了问题新手大概率是解决不了的,真心不如用 cmake+clang 三个平台分别编译。
|
11
ai277014717 36 天前
hello world 依赖 libc 所以你做要的就是在 linux 下找到所有平台的 libc 就行了。
|
12
xinge666 36 天前 via iPhone
Go 可以直接交叉编译,C++的话得有对应的工具链,比如编译 win 下就用 mingw ,macOS 就没办法了。如果上 GitHub 的话,可以直接用 Action 编译多平台的二进制。
|
13
tuiL2 36 天前
cmake 只是个辅助编译的工具。你真正需要解决的是编译器的问题
|
14
wkla 36 天前 1
可以试试 github cmake action ,有个 cmake-multi-platform.yml 的跨平台编译。然后在 ci 里获取编译产物。https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml
|
15
wnpllrzodiac 36 天前 1
zig 好像还这个可以。不过估计问题还是有,没有原生的好用。win ,mac 最好还是在原生的上面编译。linux 倒是可以用 docker 。总之 linux 的各种架构都可以在 docker 里交叉编译。
|
16
ecnelises 36 天前 1
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 |
17
passive 36 天前 via Android
用不用 cmake 都能搞,避开 configure 阶段通过 exe 生成的代码就行。
Windows 用 mingw64 几乎没问题。Fedora 的包最全。走个 wine 还能 make test 。 Mac 用 osxcross 坑很多,动手能力差的建议放弃。 |
18
jchnxu 36 天前
我用 mac 研究过一点。。结论是直接把不同的系统电脑买/借了最快,太麻烦了
|
19
sir283 36 天前
cmake + clang 或者 gcc 都可以,可以参考 qt 的跨平台方案跟 pyinstaller 的实现原理,也可以参考 termux 的 build-packages 脚本
|
20
snylonue 35 天前
借楼问一下如果有依赖在 windows 下只支持 msvc 要怎么交叉编译
|
21
davehandong 29 天前
我觉得 C/C++“交叉编译”的意义不大。
通过 cmake 构建的如果写的严谨,理论上可以在不同平台下面编译,但也只是理论, 因为打个比方说 setsockopt 函数,在 windows 、linux 、mac 下面都有,但是有区别,一套代码想都支持,要解决这种情况太多了。 C/C++可能会依赖不同的动态链接库(.so .dll .dylib),这个也是交叉编译的一个坎儿。 我觉得 cmake 挺好,比直接写 Makefile 简单,而且在 win 环境还能生成 msvc 的解决方案文件。 |