cmake简单使用

均在Ubuntu18.04上验证,cmake版本是3.10.2

基础

sudo apt install cmake
#安装cmake

cmake 路径
#创建cmake工程,创建Makefile
cmake --build 路径
#编译工程

CmakeLists.txt常用规则

指定源文件

#指定文件生成名为Tmain可执行文件
add_executable(Tmain start.cpp ./Sabcd/sabcd.cpp ./Sabcd/habcd.cpp)

#查找路径下的所有源码文件,并添加到DIR_SRCS中
aux_source_directory("./Sabcd/" DIR_SRCS)
#指定文件生成名为Tmain的可执行文件
add_executable(Tmain start.cpp ${DIR_SRCS})

头文件路径

#头文件的查找路径
#当cmake在源码路径时PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR,都表示源码路径
target_include_directories(Tmain PUBLIC 
                            "${PROJECT_BINARY_DIR}" 
                            "${PROJECT_SOURCE_DIR}/Sabcd"
                            )

链接外部库

list(APPEND EXTRA_LIBS MathFunctions)
target_link_libraries(Tmain PUBLIC ${EXTRA_LIBS})
#链接MathFunctions库,文件名应为libMathFunctions.a/.so

target_link_libraries(Tmain PUBLIC -lpthread)

设置编译选项

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Wall")

set(CMAKE_CXX_FLAGS "-w -std=c++11")
#c++和c编译器选项分别设置

add_compile_options("-Werror")
#但我在3.10.2的cmake上测试,没有效果

指定编译器

#C编译器,可以是编译器的绝对路径
set(CMAKE_C_COMPILER "aarch64-linux-gnu-gcc")
#C++编译器
set(CMAKE_CXX_COMPILER "g++")

编译静态/动态库

add_library(MathFunc mysqrt.cpp)
add_library(MathFunc STATIC mysqrt.cpp)
#将mysqrt.cpp编译成名为MathFunc的静态库
#静态库关键字为static,不加选项默认编译为静态库

add_library(MathFunc SHARED mysqrt.cpp)
#动态库的关键字为shared

指定库的输出路径

SET(LIBRARY_OUTPUT_PATH /opt/usr/libTest)
#指定编译出的库输出路径为/opt/usr/libTest
#在同一个工程里,链接这个库时,指定的路径也是库的输出路径

多目录构建

CMakeLists.txt文件可以分多层目录来构建工程

以子目录源码构建库为例:子目录有编译库所需的源码、接口头文件,将子目录的源码编译成库

顶层CMakeLists.txt文件

add_subdirectory(MathFunctions)
#添加MathFunctions子目录,并构建该子目录,该子目录下需要有对应的CMakeLists.txt文件

target_link_libraries(Tmain PUBLIC MathFunc)
#向Tmain添加MathFunc的库链接

target_include_directories(Tmain PUBLIC 
                            "${PROJECT_BINARY_DIR}"
                            "${PROJECT_SOURCE_DIR}/MathFunctions"
                            )
#添加头文件的查找路径

子目录CMakeLists.txt

add_library(MathFunc xxx.cxx)
#将xxx.cxx编译成静态库

配置可选宏

#添加选项
option(USE_MYMATH "Use tutorial provided math implementation" ON)

if(USE_MYMATH)
.......
endif()

在头文件配置文件里xxx.h.in增加

#cmakedefine USE_MYMATH

这样在cmake配置工程的时候,会将这个宏写在头文件里(如果开启的话),这样构建文件和源码都可以使用这个宏。

在构建cmake时,可以配置是否开启此宏(不加选项按照上次状态),会在头文件里生成对应的define语句

cmake 路径 -DUSE_MYMATH=ON
cmake 路径 -DUSE_MYMATH=OFF

输出信息

message函数

message(WARNING "I'm fine")

在构建cmake时输出

(无) = 重要消息;
 STATUS = 非重要消息;
 WARNING = CMake 警告, 会继续执行;
 AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
 SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
 FATAL_ERROR = CMake 错误, 终止所有处理过程;

cmake文件

文件结构

.
├── start.cpp
├── include.h.in
├── CMakeLists.txt
├── MathFunctions
│ ├── mysqrt.cpp
│ ├── MyMathFunctions.h
| ├── CMakeLists.txt
├── Sabcd
│ ├── sacbd.cpp
│ ├── efgh.cpp
│ └── sabcd.h
└── libTest
    └──

顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
#cmake的版本

project(Tmain VERSION 2.0)
#工程名Tmain,版本号2.0

aux_source_directory("./Sabcd/" DIR_SRCS)
#将./Sabcd目录下的所有源文件,添加至DIR_SRCS里
add_executable(Tmain start.cpp ${DIR_SRCS})
#指定使用start.cpp和${DIR_SRCS}编译成名为Tmain的可执行文件

configure_file(include.h.in include.h)
#指定生成include.h头文件的配置文件为include.h.in
#配置文件需要手动创建,添加内容

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDSRD_REQUIRED True)
#指定c++版本

set(CMAKE_C_COMPILER "gcc")
#指定C编译器
set(CMAKE_CXX_COMPILER "g++")
#指定C++编译器

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -w")
#set(CMAKE_CXX_FLAGS "-w -std=c++11")
#添加编译选项

option(USE_MYMATH "Use tutorial provided math implementation" ON)
#开启可选宏

if(USE_MYMATH)
    add_subdirectory(MathFunctions)
    #添加子目录,并构建
    list(APPEND EXTRA_LIBS MathFunc)
    #将MathFunc添加到EXTRA_LIBS里
endif()

target_link_libraries(Tmain PUBLIC ${EXTRA_LIBS})
#添加链接库
target_link_libraries(Tmain PUBLIC -lpthread)
#添加库pthread

target_include_directories(Tmain PUBLIC 
                            "${PROJECT_BINARY_DIR}" 
                            "${PROJECT_SOURCE_DIR}/Sabcd"
                            )
#头文件、库的包含路径
#当cmake工程在源码路径时,PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR都表示代码路径
#由于MathFunctions目录下的Cmake构建文件,给自己的库指定了包含路径和INTERFACE选项,这里就不需要再包含

MathFunctions子目录CMakeLists.txt

add_library(MathFunc SHARED mysqrt.cpp)
#将mysqrt.cpp编译成动态库MathFunc

target_include_directories(MathFunc INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})
#INTERFACE选项意为,自己不需要,链接库的消费者需要

SET(LIBRARY_OUTPUT_PATH /opt/abc/libTest)
#设置库的输出目录,在此工程里链接本库的代码,库的链接位置也都是库的输出目录

顶层include.h.in配置文件

#define Tmain_VERSION_NAJOR @Tmain_VERSION_MAJOR@
#define Tmain_VERSION_NINOR @Tmain_VERSION_MINOR@

#cmakedefine USE_MYMATH

顶部CMakeLists.txt文件里指定的工程版本,会配置给这两个选项,生成的include.h头文件也会有Tmain_VERSION_NAJOR 和Tmain_VERSION_NINOR 宏

USE_MYMATH是配置的编译宏,表示工程define了该宏

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