cmake笔记1
A Basic Starting
Hello World(for unix os like)
在源码目录新建一个名为CMakeLists.txt的文件,文件三行内容如下:
cmake_mininum_required(VERSION 3.10)
#set the project name
project(Tutorial)
#add the executable
add_executable(Tutorial tutorial.cxx)
文件中包含了三行命令,CMake命令支持大写、小写、大小写混合
三行命令含义分别为:需要的cmake软件版本3.10、工程名设置为Tutorial、代码xxx.cxx编译出可执行文件Tutorial
在命令行执行 cmake 路径 ,生成Makefile
执行 cmake --build 路径 ,编译代码生成可执行文件
版本号和头文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
#配置项目名和版本号
project(Tutorial VSERION 1.0)
#add the executable
add_executable(Tutorial tutorial.cxx)
#配置一个头文件,以便将版本号传递给源码
configure_file(TutorialConfig.h.in TutorialConfig.h)
#将配置文件的目录添加到路径列表,以搜索包含文件
target_include_directories(Tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
)
添加配置文件
TutorialConfig.h.in
//the configured options and setting for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
当CMake配置头文件时,@Tutorial_VERSION_MAJOR@和@Tutorial_VERSION_MINOR@会被替换
在源码里添加TutorialConfig.h头文件包含
#include "TutorialConfig.h"
std::cout << "Version" << Tutorial_VERSION_MAJOR << "."
<< Tutorial_VERSION_MINOR << std::endl;
指定C++标准
CMakeLists.txt
#specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDSRD_REQUIRED True)
创建工程
cmake 代码路径 (初始化工程,创建Makefile、头文件)
cmake --build 代码路径 (编译工程)
指定编译器
#或者指定编译器的绝对路径
#C编译器
set(CMAKE_C_COMPILER "arm-linux-gcc")
#C++编译器
set(CMAKE_CXX_COMPILER "arm-linux-g++")
添加库
将多目录的文件夹内编成库来调用
工程目录结构:在代码主目录添加文件夹(MathFunctions),子文件夹(MathFunctions)内新建CMakeLists.txt和相应的cxx、h文件。
子文件夹的CMakeLists.txt
add_library(MathFunc xxx.cxx)
#将xxx.cxx编译成库
顶层的CMakeLists.txt
#cmake的版本
cmake_minimum_required(VERSION 3.10)
#工程名、指定版本
project(Tmain VERSION 2.0)
#指定生成的可执行文件
#编译出的可执行文件名,依赖的文件
add_executable(Tmain start.cpp)
#使用include.h.in配置include.h头文件
configure_file(include.h.in include.h)
#给Tmain工程添加权限为PUBLIC的引用路径
#PROJECT_SOURCE_DIR代码路径
#PROJECT_BINARY_DIR生成cmake工程的目录
target_include_directories(Tmain PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_SOURCE_DIR}/MathFunctions"
)
#指定C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDSRD_REQUIRED True)
#添加子目录,并构建该目录(目录下应该有CMakeLists.txt)
add_subdirectory(MathFunctions)
#将Tmain和库MathFunctions连接
target_link_libraries(Tmain PUBLIC MathFunctions)
#链接pthread库
target_link_libraries(Tmain PUBLIC -lpthread)
配置可选宏
顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(Tmain VERSION 2.0)
add_executable(Tmain start.cpp Sabcd/sabcd.cpp)
configure_file(include.h.in include.h)
#添加选项
option(USE_MYMATH "Use tutorial provided math implementation" ON)
if(USE_MYMATH)
add_subdirectory(MathFunctions)
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTER_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()
#给Tmain链接的库
target_link_libraries(Tmain PUBLIC ${EXTRA_LIBS})
#引用路径
target_include_directories(Tmain PUBLIC
"${PROJECT_BINARY_DIR}"
"${EXTER_INCLUDES}"
"${PROJECT_SOURCE_DIR}/Sabcd"
)
在include.h.in头文件配置文件里添加
#cmakedefine USE_MYMATH
这样在cmake配置工程的时候,会将这个宏写在头文件里(如果开启的话)
工程在没有宏USE_MYMATH的时候,就不会链接MathFunctions库,
然后在代码中也可以使用USE_MYMATH宏,来决定是否调用MathFunctions库中的函数。
cmake 路径 -DUSE_MYMATH=ON
cmake 路径 -DUSE_MYMATH=OFF
#工程开启或关闭USE_MYMATH宏
库的使用要求
给库使用INTERFACE选项,表示链接到这个库的人都需要这个库,而库本身不需要。
在MathFunctions/CMakeLists.txt添加
target_include_directories(MathFunctions INTERFACE
${CMAKE_CURRENT_SOURCE_DIR})
顶层的CMakeLists.txt,去掉包含路径命令的MathFunctions选项
target_include_directories(Tmain PUBLIC
"${PROJECT_BINARY_DIR}"
"${PROJECT_SOURCE_DIR}/Sabcd"
)
安装
安装:MathFunctions需要安装库和头文件,对于程序需要安装可执行文件和配置的头文件
在MathFunctions/CMakeLists.txt添加
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)
在顶层CMakeLists.txt文件添加
install(TARGETS Tmain DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/include.h"
DESTINATION include
)
cmake --install 代码目录
可以使用CMAKE_INSTALL_PREFIX来确定安装文件的根目录
也可以在install使用命令行指定
cmake --install 代码目录 --prefix "/opt/xxx/xxx/xxx"
官方资料:
https://cmake.org/cmake/help/v3.21/guide/tutorial/index.html