make命令
make
命令的执行基于Makefile
文件内包含的命令
个人觉得Makefile
就像是一个shell
的脚本,把C/C++的在shell
中的编译指令在Makefile
中罗列,并以目标与依赖的形式对要执行的编译指令进行索引排序。make
命令也可将Makefile
中的一段指令单独执行。当然,在Makefile
文件中也可执行许多其他的shell
命令。
cmake命令
cmake
根据CMakeLists.txt
文件生成对应的Makefile
文件,之后就可以调用make
对项目进行编译。此外,cmake
还能配合ninja
来实现代码的编译。个人觉得cmake
降低了 make
的使用门槛。
以下为本人摸索CMakeLists.txt
文件编写得出的经验。
CMakeLists.txt 编写
首先安利一下VScode
,作为一个插件丰富、自动代码补全的编辑器,它的cmake
插件蛮不错的。
包含头文件目录主要有两种方式,全局路径包含和目标指向的路径包含
include_directories()
:全局路径包含target_include_directories()
:目标指向的路径包含
PUBLIC
:当前库包含调用库的目标也包含该目录
PRIVATE
:仅当前库包含该目录,调用库的目标不包含该目录
INTERFACE
:当前库不包含该目录,仅调用库的目标包含该目录
add_library()
:构建库
STATIC
:静态库,生成的可执行文件不依赖库,可以独立运行,方便发布,;但占据空间,编译较慢
SHARED
:动态库,生成的可执行文件依赖库,不能独立运行;占据空间少,编译快
CMakeLists.txt 基本模板
cmake_minimum_required(VERSION 3.0.0) #最低cmake版本要求
project( example ) #添加工程名称
find_package(package_name REQUIRED) #添加外部库
include_directories(DIR ...) #添加(头文件)包含路径
add_executable(${PROJECT_NAME} main.cpp) #构建可执行文件
add_subdirectory(DIR ...) #添加需要编译的子目录,子目录中也需包含CMakeLists.txt文件
add_library(lib [STATIC|SHARED] lib.cpp ...) #构建库
target_include_directories( <example or lib> [PUBLIC|PRIVATE|INTERFACE] DIR ...) #指定目标添加(头文件)包含目录。
target_link_libraries(${PROJECT_NAME} lib) #链接目标和库
link_directories( DIR ...) #添加搜索库在的目录/***
target_link_directories(<example or lib> [PUBLIC|PRIVATE|INTERFACE] DIR ...) #添加搜索库的目录/***