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

posted @ 2021-11-02 16:50  WuYunTaXue  阅读(50)  评论(0编辑  收藏  举报