CMake笔记

CMake语法

cmake_minimum_required( VERSION  3 )                    # cmake版本要求
project( project_name )                                 # 定义工程名

set( CMAKE_CXX_FLAGS “-std=c++11” )                     # 添加c++11标准
                                                        # set()用于设置变量

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的文件。

Leave a Reply

Your email address will not be published. Required fields are marked *