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

2021-09-04 12:10:34 +08:00
 Yc1992
举个例子,我同时需要在 linux 和 macos 上编译一个 c++ 的程序,但是静态库的路径是不一样的。

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

ELSEIF(UNIX)

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

我 docker 虚拟机 本机 mac 在同一个仓库 开会编译 linux mac win android 程序 完全无干扰 随意切换,增量编译都互不影响,因为 obj 文件啥的 都相互隔离了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799826

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX