栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

CMake 学习笔记

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

CMake 学习笔记

文章目录
  • 1、跨平台开发
  • 2、语法特性介绍
    • 3、重要指令和 CMake 常用变量
    • 3.1、重要指令
    • 3.2、CMake 常用变量

学习笔记来自于 基于VSCode和CMake进行C/C++开发「第六讲」CMake。

简介:

  • CMake 是一个跨平台的安装编译工具,可以使用简单的语句来描述所有平台的安装(编译过程)。
  • CMake 可以说是已经成为了大部分 C++ 开源项目的标配。
1、跨平台开发

有一个跨平台项目,在不同的 系统/IDE 上共享 C++ 代码。 假设在 Windows 上使用 Visual Studio,在 Mac OS 上使用 Xcode,在 Linux 上使用 Makefile:

此时想要添加一个 bar.cpp 的文件,为了保证环境的一致性,必须需要在每个 IDE 中进行添加,这样的操作必然繁琐,容易出错,且不灵活:

现在可以使用 CMake 编写CMakefile.txt,这样来完成跨平台的 CMake 代码:


现在只需要一步就能添加新文件 bar.cpp:


2、语法特性介绍

1)基本语法格式:指令(参数1 参数2…)

  • 参数使用括弧括起来
  • 参数之间使用空格或分号分开

2)指令是不区分大小写的,参数和变量需要区分大小写

# 参数和遍历需要区分大小写,变量 HELLO 使用的是大写
set(HELLO hello.cpp)
# 指令不区分大小写 add_executable 与 ADD_EXECUTABLE
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})

3)使用变量${}方式取值,但是在 IF 控制语句中是直接使用变量名的


3、重要指令和 CMake 常用变量 3.1、重要指令

1)cmake_minimum_required - 指定 CMake 的最小版本要求

  • 语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
# CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)

2)project - 定义工程名称,并可指定工程支持的语言

  • 语法:project(projectname [CXX] [C] [Java])
# 指定工程名为 HelloWorld
project(HelloWorld)

3)set - 显式的定义变量

  • 语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# 定义 SRC 变量,其值为 main.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)

3)include_directories - 向工程添加多个特定的头文件搜索路径 —>相当于指定 g++ 编译器的 -I 参数

  • 语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)

4)link_directories - 向工程添加多个特定的库文件搜索路径 —>相当于指定 g++ 编译器的 -L 参数

  • 语法:link_directories(dir1 dir2 …)
# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)

5)add_library - 生成库文件

  • 语法:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})

6)add_compile_options - 添加编译参数

  • 语法:add_compile_options(编译参数)
# 添加编译参数 -Wall -std=c++11
add_compile_options(-Wall -std=c++11 -O2)

7)add_executable - 生成可执行文件

  • 语法:add_executable(生成的文件名 main.cpp)
# 编译 main.cpp 生成可执行文件 main
add_executable(main main.cpp)

8)target_link_libraries - 为 target 添加需要链接的共享库 —>相同于指定 g++ 编译器-l参数

  • 语法:target_link_libraries(target library1library2…)
# 将 hello 动态库文件链接到可执行文件 main
target_link_libraries(main hello)

9)add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置

  • 语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 添加 src 子目录,src 中需有一个 CMakeLists.txt
add_subdirectory(src)

10)aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表

  • 语法:aux_source_directory(dir VARIABLE)
# 定义 SRC 变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
# 编译 SRC 变量所代表的源代码文件,生成 main 可执行文件
add_executable(main ${SRC})

3.2、CMake 常用变量

1)CMAKE_C_FLAGS gcc编译选项;CMAKE_CXX_FLAGS g++编译选项

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

2、CMAKE_BUILD_TYPE 编译类型(Debug, Release)

# 设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug) 
# 设定编译类型为release,发布时需要选择release
set(CMAKE_BUILD_TYPE Release) 

3)CMAKE_BINARY_DIR;PROJECT_BINARY_DIR;__BINARY_DIR

这三个变量指代的内容是一致的。如果是 in source build,指的就是工程顶层目录;如果是 out-of-source 编译,指的是工程编译发生的目录;PROJECT_BINARY_DIR 跟其他指令稍有区别,不过现在,你可以理解为他们是一致的。


4)CMAKE_SOURCE_DIR;PROJECT_SOURCE_DIR;__SOURCE_DIR

这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录;也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致;PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。


5)CMAKE_C_COMPILER:指定C编译器

6)CMAKE_CXX_COMPILER:指定C++编译器

7)EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径

8)LIBRARY_OUTPUT_PATH:库文件输出的存放路径

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850131.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号