Cmake 使用过程中的一些记录
写在前面
终于还是用起来cmake了, 先前都是手撕makefiles, 直接用makefiles编写项目文件
但终归还是太麻烦,需要考虑各种依赖关系,可以说是事无巨细,后来转到windows上做项目开发,才发现
cmake特别好用,真的能省很多事
参考
优雅的本地开发,远程linux环境调试,Clion决绝子
Cmake-Example
一个非常好的github开源库,作为cmake初学者非常适用
记录常用到的cmake用法
include_directories
设定本项目引入的头文件路径,${PROJECT_SOURCES}
可以通过set()
来设置;
当引入头文件路径后,在项目编写时就可以非常优雅的引入了
例如: 项目结构如下
假设headerB
需要引入headerA.h
头文件, 一般的写法是include "../../basic/headerA.h"
这种相对路径
当我们设置include_directories(${main_project_path}/include)
后
只需要在headerB.h
中写include "basic/headerA.h"
就可以了,系统会自动帮我们找到对于的路径下的文件
那么在main.cpp
中引入头文件时
只需要编写:
target_link_libraries 与 target_include_directories
target_link_libraries
target_include_directories
这两个的用法都是在设定生成库文件或者可执行文件标识之后:
add_library / add_executable
其中,
target
是目标名称,可以是库或可执行文件的名称。
SYSTEM
表示这些头文件是系统头文件,BEFORE
表示这些路径将被添加到其他路径之前。INTERFACE
、PUBLIC
和PRIVATE
是指定这些路径的可见性。它们的含义如下:
INTERFACE
:这些路径只会被添加到目标的接口中,不会被添加到目标自身的编译选项中。PUBLIC
:这些路径会被添加到目标自身的编译选项中,同时也会被添加到目标的接口中。PRIVATE
:这些路径只会被添加到目标自身的编译选项中,不会被添加到目标的接口中。
items
是头文件搜索路径,可以是绝对路径或相对路径。如果是相对路径,会相对于当前 CMakeLists.txt 文件所在的目录进行解析。
Subject
项目结构:
sub_projectA
与sub_projectB
都是main_project
的依赖库
其中projectB
又依赖于projectA
在main_project
下的CMakeLists.txt
中
可以通过一下命令,给子subject传参, 以及添加子项目
在sub_projectB
中通过主项目的传参,拿到sub_projectA
的路径,就可以
设置include_directories
target_link_libraries
target_include_directories
了
预览: