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

请教 cmake 中如何兼容不同的编译环境

  •  
  •   Yc1992 ·
    bufrr · 2021-09-04 12:10:34 +08:00 · 2140 次点击
    这是一个创建于 958 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个例子,我同时需要在 linux 和 macos 上编译一个 c++ 的程序,但是静态库的路径是不一样的。

    目前我的做法是在 cmakelists.txt 中同时硬编码两个不同环境的静态库路径,编译的时候注释掉 linux 的库路径来编译 macos 平台的程序这样,但是我觉得应该有更好的办法,不知道谁能告知一下,谢谢
    11 条回复    2021-10-20 08:01:51 +08:00
    ulosggs
        1
    ulosggs  
       2021-09-04 12:27:32 +08:00
    IF(APPLE)

    ELSEIF(UNIX)

    ENDIF
    paoqi2048
        2
    paoqi2048  
       2021-09-04 12:30:48 +08:00
    条件编译
    Hconk
        3
    Hconk  
       2021-09-04 12:56:45 +08:00 via iPhone
    最好是通过 find_package 管理,可以试试 vcpkg
    msg7086
        4
    msg7086  
       2021-09-04 13:06:28 +08:00
    https://cmake.org/cmake/help/latest/command/find_library.html
    https://cmake.org/cmake/help/latest/command/find_package.html
    这两个吗?正常途径安装的应该都能找到的,不需要自己写路径。
    mingl0280
        5
    mingl0280  
       2021-09-04 14:17:35 +08:00 via Android
    if(APPLE)
    else if(UNIX AND NOT APPLE)
    endif()
    Yc1992
        6
    Yc1992  
    OP
       2021-09-04 16:04:27 +08:00
    @ulosggs
    @paoqi2048
    @Hconk
    @msg7086
    @mingl0280
    感谢,我去看一下相关的文档
    cuminflea
        7
    cuminflea  
       2021-09-04 18:11:25 +08:00
    如果是 header-only 的 dependency 的话十分推荐 cpm: https://github.com/cpm-cmake/CPM.cmake
    Yc1992
        8
    Yc1992  
    OP
       2021-09-04 21:07:24 +08:00
    @cuminflea 依赖挺多的,有.a 和 .dylib 还分 x86 和 arm64 架构
    mingl0280
        9
    mingl0280  
       2021-09-05 17:18:00 +08:00 via Android
    @Hconk
    @Yc1992
    find_package 在他的环境下严重不推荐,因为你不知道他的库到底是哪个环境下的,而 cmake 很有可能自己瞎几把找个不匹配的版本当匹配的版本在编译最后给你甩一脸的链接错误,或者是相似 os 的库链接上了最后执行的时候莫名其妙执行不了报 no such file or directory,我之前被这个坑惨了。
    后来就是一堆 if else 强制规定某个情况下用哪个 lib 就解决了。
    Yc1992
        10
    Yc1992  
    OP
       2021-09-05 20:17:12 +08:00
    @mingl0280 明白了 谢谢
    waruqi
        11
    waruqi  
       2021-10-20 08:01:51 +08:00 via Android
    用 xmake 就行了,一行配置都不用改,默认就是分平台,arch 存储输出文件,互相不冲突

    我 docker 虚拟机 本机 mac 在同一个仓库 开会编译 linux mac win android 程序 完全无干扰 随意切换,增量编译都互不影响,因为 obj 文件啥的 都相互隔离了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1522 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:06 · PVG 01:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.