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