cmake 交叉编译有大佬懂吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cohen121
V2EX    C++

cmake 交叉编译有大佬懂吗?

  •  
  •   cohen121 2024-10-01 16:46:56 +08:00 5539 次点击
    这是一个创建于 373 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    21 条回复    2024-10-09 17:55:15 +08:00
    star9029
        1
    star9029  
       2024-10-01 16:56:18 +08:00
    MrKrabs
        2
    MrKrabs  
       2024-10-01 18:35:28 +08:00
    可以用 zig
    0d
        3
    0d  
       2024-10-01 18:40:07 +08:00
    可以找一些流行的开源跨平台项目看看,打开 github workflow 看看他们是如何构建和分发的
    qfly
        4
    qfly  
       2024-10-01 18:51:58 +08:00 via Android
    可以,使用 mingw 交叉编译,先编译工具链 https://github.com/Zeranoe/mingw-w64-build ,。最终 app 最好做成静态链接。支持 cmake 以及 make 文件的项目。但涉及的所有 lib 都得要交叉编译。
    qfly
        5
    qfly  
       2024-10-01 19:02:04 +08:00 via Android
    关于 Mac 。有差不多现成的。但大的框架比如 qt ,需要很多 patch ,且不支持全部组件,特别是开源版本的。qt5 和 qt6 都支持。建议参考 osxcross 基本你要的都有,支持 arm 和 Intel ,c++交叉编译器 选 clang ,不要用 GCC ,否则超多坑。其他 Linux 下签名工具打包工具都有。但还是需要一个 Mac 测试。
    0o0O0o0O0o
        6
    0o0O0o0O0o  
       2024-10-01 19:05:22 +08:00 via iPhone
    tool2dx
        7
    tool2dx  
       2024-10-01 19:23:41 +08:00 via Android
    完不成,mac 我都是用 ssh 编译的,就算这样还是很难。

    安卓倒是容易,那是因为 google 有跨平台的工具链,而苹果没有。
    yaott2020
        8
    yaott2020  
       2024-10-01 19:37:00 +08:00 via Android   1
    楼主要不要试试看 Rust (勾引
    jinliming2
        9
    jinliming2  
       2024-10-01 20:50:46 +08:00 via iPhone
    写过 Go 的话,Go 本身不就是可以直接跨平台编译吗?甚至简单到只要指定个环境变量就行了。但仅限于纯 Go 代码,没有 C 依赖的。
    coderluan
        10
    coderluan  
       2024-10-01 20:55:06 +08:00   1
    可以但是不推荐,因为没有办法同时交叉编译 Linux 和 Mac 平台的方案,也就是你得用两套,Windows 用 mingw ,Linux 用 zig ,然后出了问题新手大概率是解决不了的,真心不如用 cmake+clang 三个平台分别编译。
    ai277014717
        11
    ai277014717  
       2024-10-01 20:59:35 +08:00
    hello world 依赖 libc 所以你做要的就是在 linux 下找到所有平台的 libc 就行了。
    TaurusXin
        12
    TaurusXin  
       2024-10-01 21:01:18 +08:00 via iPhone
    Go 可以直接交叉编译,C++的话得有对应的工具链,比如编译 win 下就用 mingw ,macOS 就没办法了。如果上 GitHub 的话,可以直接用 Action 编译多平台的二进制。
    tuiL2
        13
    tuiL2  
       2024-10-01 22:01:22 +08:00
    cmake 只是个辅助编译的工具。你真正需要解决的是编译器的问题
    wkla
        14
    wkla  
       2024-10-01 22:25:14 +08:00   1
    可以试试 github cmake action ,有个 cmake-multi-platform.yml 的跨平台编译。然后在 ci 里获取编译产物。https://github.com/actions/starter-workflows/blob/main/ci/cmake-multi-platform.yml
    wnpllrzodiac
        15
    wnpllrzodiac  
       2024-10-01 22:40:49 +08:00   1
    zig 好像还这个可以。不过估计问题还是有,没有原生的好用。win ,mac 最好还是在原生的上面编译。linux 倒是可以用 docker 。总之 linux 的各种架构都可以在 docker 里交叉编译。
    ecnelises
        16
    ecnelises  
       2024-10-02 00:13:05 +08:00   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
    passive
        17
    passive  
       2024-10-02 05:12:02 +08:00 via Android
    用不用 cmake 都能搞,避开 configure 阶段通过 exe 生成的代码就行。

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

    Mac 用 osxcross 坑很多,动手能力差的建议放弃。
    jchnxu
        18
    jchnxu  
       2024-10-02 08:04:19 +08:00
    我用 mac 研究过一点。。结论是直接把不同的系统电脑买/借了最快,太麻烦了
    sir283
        19
    sir283  
       2024-10-02 10:02:13 +08:00
    cmake + clang 或者 gcc 都可以,可以参考 qt 的跨平台方案跟 pyinstaller 的实现原理,也可以参考 termux 的 build-packages 脚本
    snylonue
        20
    snylonue  
       2024-10-03 13:40:34 +08:00
    借楼问一下如果有依赖在 windows 下只支持 msvc 要怎么交叉编译
    davehandong
        21
    davehandong  
       2024-10-09 17:55:15 +08:00
    我觉得 C/C++“交叉编译”的意义不大。
    通过 cmake 构建的如果写的严谨,理论上可以在不同平台下面编译,但也只是理论,
    因为打个比方说 setsockopt 函数,在 windows 、linux 、mac 下面都有,但是有区别,一套代码想都支持,要解决这种情况太多了。
    C/C++可能会依赖不同的动态链接库(.so .dll .dylib),这个也是交叉编译的一个坎儿。
    我觉得 cmake 挺好,比直接写 Makefile 简单,而且在 win 环境还能生成 msvc 的解决方案文件。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3394 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 05:04 PVG 13:04 LAX 22:04 JFK 01:04
    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