V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cohen121
V2EX  ›  C++

cmake 交叉编译有大佬懂吗?

  •  
  •   cohen121 · 63 天前 · 3270 次点击
    这是一个创建于 63 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    安卓倒是容易,那是因为 google 有跨平台的工具链,而苹果没有。
    yaott2020
        8
    yaott2020  
       63 天前 via Android   ❤️ 1
    楼主要不要试试看 Rust (勾引
    jinliming2
        9
    jinliming2  
       63 天前 via iPhone
    写过 Go 的话,Go 本身不就是可以直接跨平台编译吗?甚至简单到只要指定个环境变量就行了。但仅限于纯 Go 代码,没有 C 依赖的。
    coderluan
        10
    coderluan  
       63 天前   ❤️ 1
    可以但是不推荐,因为没有办法同时交叉编译 Linux 和 Mac 平台的方案,也就是你得用两套,Windows 用 mingw ,Linux 用 zig ,然后出了问题新手大概率是解决不了的,真心不如用 cmake+clang 三个平台分别编译。
    ai277014717
        11
    ai277014717  
       63 天前
    hello world 依赖 libc 所以你做要的就是在 linux 下找到所有平台的 libc 就行了。
    xinge666
        12
    xinge666  
       63 天前 via iPhone
    Go 可以直接交叉编译,C++的话得有对应的工具链,比如编译 win 下就用 mingw ,macOS 就没办法了。如果上 GitHub 的话,可以直接用 Action 编译多平台的二进制。
    tuiL2
        13
    tuiL2  
       63 天前
    cmake 只是个辅助编译的工具。你真正需要解决的是编译器的问题
    wkla
        14
    wkla  
       63 天前   ❤️ 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  
       63 天前   ❤️ 1
    zig 好像还这个可以。不过估计问题还是有,没有原生的好用。win ,mac 最好还是在原生的上面编译。linux 倒是可以用 docker 。总之 linux 的各种架构都可以在 docker 里交叉编译。
    ecnelises
        16
    ecnelises  
       63 天前   ❤️ 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  
       62 天前 via Android
    用不用 cmake 都能搞,避开 configure 阶段通过 exe 生成的代码就行。

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

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