CMake笔记
CMake语法
cmake_minimum_required( VERSION 3 ) # cmake版本要求
project( project_name ) # 定义工程名
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 添加c++11标准
# set()用于设置变量
aux_source_directory(<dir> <variable>) # 收集指定目录中所有源文件的名称,并将列表存储在提供的<variable>变量中
find_package( pkg_name VERSION REQUIED COMPONANT ) # 找到已安装的包:
# 程序会首先从/usr/local /usr中寻找pkg的cmake文件
# 对于已安装且只有头文件的库:
include_directories( “/usr/include/eigen3” ) # 如Eigen,可以直接包含头文件路径即可
include_directories( ${ pkg_name_INCLUDE_DIRS } ) # 对于找到的库,可以通过这样的方式引用其头文件和库路径
add_library( lib_name lib.cpp ) # 生成并添加静态库文件 .a
add_library( lib_shared_name SHARED lib_shared.cpp ) # 生成并添加共享库文件 .o
add_executable( pro_name exe.cpp ) # 添加可执行文件
target_link_libraries( pro_name lib_name ${ pkg_name_LIBS } ) # 向可执行文件添加库链接:
# 如果库通过此cmakelists文件生成,则需要先add_library()
# 如果库已经编译安装,则需要先find_package()
CMake小知识
find_package()
** find_package()
https://www.jianshu.com/p/39fc5e548310 深入理解find_package
https://blog.csdn.net/bytxl/article/details/50637277 find_package与CMake如何查找链接库详解
简单扯一下:find_package有两种模式(基本用法Module/完全用法Config)
* 0 默认是Module,当使用关键字CONFIG或NO_MODULE,亦或使用了非Module模式支持关键字,则转为Config。另外,按用户指定的配置却找不到包,就会自动进入Config模式,但使用MODULE关键字,则不转入Config
* 1 Module模式下,查找Find< PackageName >.cmake文件,先在CMAKE_MODULE_PATH变量对应的路径中查找。如果路径为空,或者路径中查找失败,则在cmake安装时的Modules目录,比如/usr/local/share/cmake/Modules查找
* 2 Config模式下,查找< PackageName >Config.cmake或< lower-case-package-name >-config.cmake。 < PackageName >_DIR为config模式特有,< PackageName >_DIR很傻,不会在子目录中寻找,有待验证(好像可以找?)。如果设置了< package >_DIR变量,但是它没有包含配置文件信息,那么CMake将会直接无视它,然后重新开始查找
* 3 module模式下,在find_package()前使用< PackageName >_DIR,并不能用来帮助find_package()找到包,并且在find_package()后,也并没有< PackageName >_DIR缓存变量自动存在。
* 4 配置文件*.cmake 记录包的各种文件路径信息,cmake文件的完整地址存储在cmake的变量< package >_CONFIG。可以通过list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules) 添加自定义模块路径
* 5 版本号问题
** find_package关键字
* REQUIRED 表示一定要找到包,找不到的话就立即停掉整个cmake
* COMPONENTS 查找的包中必须要找到的组件,如果有任何一个找不到就立即停掉整个cmake
* NAMES 其后的names参数会取代的角色,该命令会为每个在names中的name搜索名为Config.cmake或者<name全小写>-config.cmake的文件。