cmake学习总结

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})

你可能感兴趣的:(学习,vscode,ide)