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了该宏