CMake学习后续
有了上一篇,基础的cmake使用配合IDE已经能完成基本的工作了,对于复杂的项目,一般还需要配合编译器做定制。
比如使用Boost库,CUDA,使用Qt框架,使用CMake编译嵌入式程序…
甚至可以考虑使用ctest指令完成代码的单元测试,或者install指令或者cpack制作安装脚本。还可以通过配置不同编译器,进行跨平台编译。
CMake目前支持的语言和领域都有了长足的进度,对于Python,Swift,C#等开始支持,对Git的submodule也支持良好,支持FetchContent一类的在线下载支持库等。
Cmake虽然复杂,但是在各个领域非常通用,对IDE配合良好,基础使用不需要太多知识,值得学习。先上手,遇到问题再去解决。
find_package 使用
参考链接: https://www.jianshu.com/p/a0915895dbbc
假设代码如下:
// test.cpp
// 打印lzma库的版本号
// 依赖系统安装的的LibLZMA库
#include "lzma.h"
#include <iostream>
int main(int argc, char** argv)
{
const char* version = lzma_version_string();
std::cout << "lzma version is: " << version << std::endl;
return 0;
}
- 模块模式:
# CMakeLists.txt
find_package(LibLZMA MODULE) # MODULE指定使用模块模式查找
if (LibLZMA_FOUND)
message("Find lzma library: ${LIBLZMA_INCLUDE_DIR}, ${LIBLZMA_LIBRARY}")
include_directories(${LIBLZMA_INCLUDE_DIR})
add_executable(test test.cpp)
target_link_libraries(test ${LIBLZMA_LIBRARY})
endif()
# 命令行输出(只展示跟例子相关的输出)
Find lzma library: /usr/local/include, /usr/local/lib/liblzma.dylib
lzma version is: 5.2.5
- 配置模式:
# lzmaConfig.cmake
set(lzma_INCLUDE_DIR "/usr/local/include")
set(lzma_LIBRARY "/usr/local/lib/liblzma.dylib")
# CMakeLists.txt
find_package(lzma CONFIG
NAMES lzma
PATHS ./)
if (lzma_FOUND)
message("Find lzma library: ${lzma_INCLUDE_DIR}, ${lzma_LIBRARY}")
include_directories(${lzma_INCLUDE_DIR})
add_executable(test test.cpp)
target_link_libraries(test ${lzma_LIBRARY})
endif()
# 命令行输出(只展示跟例子相关的输出)
Find lzma library: /usr/local/include, /usr/local/lib/liblzma.dylib
lzma version is: 5.2.5
参考的其他教程
-
网上的教程版本都很老,CMake现代化的教程
https://www.bookstack.cn/read/Modern-CMake-CN-Modern-CMake-zh_CN/08ad6f6237beace2.md -
Qt Project CMake Support
https://blog.csdn.net/A642960662/article/details/123077371
https://blog.csdn.net/CUBE_lotus/article/details/128507180 -
STM32 CMake支持 《== (超级推荐)
https://gitee.com/Matrixant/qtcreator_cmake_stm32_template/blob/master/CMakeLists.txt -
ELF,BIN,HEX 格式区别
https://zhuanlan.zhihu.com/p/359999550
https://blog.csdn.net/weixin_42822110/article/details/96892793 -
别人的CMake系列教程
https://www.jianshu.com/p/71ba8e8646cc