cmake主要用于跨平台的文件构建
cmake命令将CMakeLists.txt文件构建为make所需要的makefile文件,最后通过make命令编译源码生成可执行程序或者共享库
cmake编译命令
Shift + ctrl + p 打开vscode的命令控制行
cmake:configure 配置cmake使用的编译器
cmake:build 构建,也可以使用F7一键构建
cmake变量
(1)CMake中所有的变量都是string类型。
(2)set()/unset():声明/移除一个变量
(3)声明变量:set(变量名 变量值)
set(var 123)
(4)引用变量:${变量名}
${var}
(5)打印变量:message(“变量名 = ${变量名}”)
message(“var = ${var}”)
实现cmake的简单代码
--main.c
--CMakelists.txt
PROJECT(HELLO) #PROJECT(projectname [CXX] [C] [Java]):指定工程名,并指定语言
SET(SRC_LIST main.c) #SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]):定义变量,也可以定义多个文件
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR}) #向终端输出信息
MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST}) #定义了这个工程会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中
定义的源文件列表,这里需要特别解释的是作为工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的。
cmake . //.代表当前目录,生成makefile文件,和一些中间件
make //执行make,生成 hello 的可执行文件
./hello //执行
cmake命令和变量
命令:
ADD_SUBDIRECTORY:ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 该命令告诉CMake去子目录中查看可用的CMakeLists.txt文件
ADD_LIBRARY:ADD_LIBRARY(libname [SHARED|STATIC] 告诉工程生成一个库文件
find_package(xxx REQUIRED):在计算机中寻找符合要求的第三方库,required代表这个库是必须的,如果没有会报错
file(GLOB xxxx "${PROJECT_SOURCE_DIR}/src/*.h") : 指定目录下的指定源文件存放在变量xxx中
add_executable(${CMAKE_PROJECT_NAME} ${xxx})生成可执行文件
target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE XXX):链接库,否则会遇到无法解析的错误
target_compile_features(${CMAKE_PROJECT_NAME} PRIVATE cxx_std_17): 打开c++17的语法支持
add_custom_command():自动化操作
变量:
PROJECT_NAME project命令中写的项目名
CMAKE_VERSION 当前使用CMake的版本
PROJECT_SOURCE_DIR 同工程顶层目录
CMAKE_BINARY_DIR 工程编译发生的目录,即执行cmake命令进行项目配置的目录,一般为build
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRRENT_BINARY_DIR 当前处理的CMakeLists.txt中生成目标文件所在编译目录
cmake外部编译
直接在源代码处使用cmake会产生一些中间件,这会影响源代码文件。我可以在其他地方创建一个build目录,在里面使用cmake命令,这样生成的中间件只会存在于build目录下,源代码文件比较纯净,这就是外部编译。
外部编译的过程如下:
1,首先,请清除当前目录中除 main.c CmakeLists.txt 之外的所有中间文件,最关键 的是 CMakeCache.txt。
2,在 当前目录中建立 build 目录,当然你也可以在任何地方建立 build 目录,不一定必 须在工程目录中。 3,进入 build
目录,运行 cmake …(注意,…代表父目录,因为父目录存在我们需要的 CMakeLists.txt,如果你在其他地方建立了
build 目录,需要运行 cmake <工程的全 路径>),查看一下 build 目录,就会发现了生成了编译需要的 Makefile
以及其他的中间 文件. 4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。 上述过程就是所谓的
out-of-source 外部编译,一个最大的好处是,对于原有的工程没 有任何影响,所有动作全部发生在编译目录。
模板:
## This is a standard CMakeLists.txt template, including
## how to enable C++11 compiler option and how to set 'Release'
## target compile option
cmake_minimum_required(VERSION 2.8)
project(cmake_template)
############# Use message function to print information ############
message(STATUS "CMake version: ${CMAKE_VERSION}")
############ enable C++11 compiler###############
## Method 1
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
message(WARNING "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support.")
message(STATUS "Please use a different C++ compiler.")
endif()
## Method 2
set(CMAKE_CXX_STANDARD 11)
############ #enable warnings##################
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall")
#############Set cmake compiler options##############
## Method 1
set(CMAKE_BUILD_TYPE "Release")
## Method 2
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)
################## Some useful arguments ##########################
set(CMAKE_INCLUDE_CURRENT_DIR ON)
##########
##Build###
##########
add_library(lib hello.cpp)
add_executable(main main.cpp)
target_link_libraries(main ${LINK_LIBRARIES})