cmake-下载和安装
创始人
2025-06-01 05:28:00

1.下载和安装

cmake:https://cmake.org/download/ (cmake需要配置环境变量)
cmake并不具备编译功能,需要下载MinGW编译器。
MinGW:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
cmake官方文档:https://cmake.org/cmake/help/latest/guide/tutorial/index.html#introduction

2.构建,运行与说明

windows环境手动演示过程:
1.先建文件夹demo
2.demo文件夹下创建src和build文件夹
3.src文件下创建main.cpp和CMakeList.txt

-demo
--src
----main.cpp
----CMakeList.txt
--build

命令行演示过程:
1.新建一个构建目录

mkdir build

2.进入该目录并配置项目

cd build
cmake ../src

如果cmake …/src报Cmake Error at CMakeList.txt原因是cmke和编译器版本不对
可以使用命令查看默认的编译器版本

cmake --help

3.如果不是使用默认的Generator,应该添加-G 选项:

cmake -G "MinGW Makefiles"  ../src

4.构建

cmake --build.

会生成.exe文件

5.运行.exe文件

3.说明

  • cmake命令(可以理解为函数名)不区分大小写,但是参数,变量区分大小写。
  • 参数用空格或分号隔开
  • 使用${VAR}引用变量
  • 引号可加可不加,但如果字符串中有空格必须加

4.概念

  • 目标文件(target):可执行文件(add_executable),库文件(add_library)
  • 命令(cmake-command):下面要讲得函数
  • 变量(cmake-variable):以CMAKE_开头的变量名
  • 属性(cmake-properties):文件/文件夹都有各自的属性

5. 命令

官方文档:https://cmake.org/cmake/help/latest/command/project.html

1.cmake_minimum_required

设置最低cmake版本。

cmake_minimum_required(VERSION )

举例:

cmake_minimum_required(VERSION 3.10)

2.project

设置项目名

project( [...])
project([VERSION [.[.[.]]]][DESCRIPTION ][HOMEPAGE_URL ][LANGUAGES ...])

举例:

project(demo)
project(demo VERSION 1.0 LANGUAGES CXX)

项目名称PROJECT_NAME
可以通过如下命令查看:

message(${PROJECT_NAME}

3.add_executable

用指定的源文件为项目添加可执行文件

add_executable( [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 ...])

例如:name和name.exe一个名字
也可以指定demo的来源文件,如下:

add_executable(demo main.cpp)

4.message

打印信息。

message([] "message text" ...)# STATUS 前缀为--的信息
# SEND_ERROR 产生错误,跳过生成过程
# FATAL_ERROR 产生错误,终止运行

5.set

1.将变量设置为指定值。

set( )

例如:

set(A 1)
message(${A})

2.设置C++标准
例如:C++ 11的标准

set(CMAKE_CXX_STANDARD 11)

3.设置输出文件位置

# 设置运行时目标文件(exe, dll)的输出位置
set(CMAKE_RUNTIME_OUTPUT_DIRCTORY${CMAKE_BINARY_DIR}/bin)#设置存档目标文件(lib,a)的输出位置
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY${CMAKE_BINARY_DIR}/lib)

6.option

定义一个开关

option( "" [value])# value的值为ON 或OFF,默认为OFF
# 命令行  -D=ON/OFF

例如:设置VERSION_ENABLE为ON

option(VERSION_ENABLE "output version" ON)

7.configure_file

将输入文件进行替换并生成输出文件。

configure_file( )#输入文件中形如@VAR@ 或${VAR}的字符串会被替换为这些变量的当期值,如果未定义则替换为空字符串。
#其他规则见下

例如:
创建文件:config.h.in,内容如下:

#define PRO_VERSION_MAJOR @PRO_VERSION_MAJOR@
#define  PRO_VERSION_MAJOR @PRO_VERSION_MINOR@

CMakeList.txt输入如下内容:

configure_file(config.h.in config.h)

需要注意:上述的话需要定义在定义项目版本之后。
在main.cpp中加入内容

#include "config.h"
int mian()
{cout<<"version"<< PRO_VERSION_MAJOR<<"."<

还需要添加target_link_librariy,重新build,会输出version:1.0。

#cmakefile VAR
//会被替换为以下两行之一,取决于VAR是否被设置
#define VAR ...
/* #undef VAR */

例如:

CMakeList.txt中添加:

option(DATE_ENABLE "output data" ON)
if(DATE_ENABLE)SET(date  "2022.7.12“)
endif()

config.h.in中添加:

#cmakedefine DATE "2022.7.12“

如果DATE_ENABLE设置为ON,输出的config.h文件中输出为#define VAR 2022.7.12
如果DATE_ENABLE设置为OFF,输出的config.h文件中输出为#undef VAR

8.add_definitions

add_definitions()相当于 C/C++ 里面的 #define 宏定义功能.

add_definitions(-DFOO -DBAR ...)

9.aux_source_directory

搜集所有在指定路径下的源文件的文件名,并将输出结果列表储存在指定的变量中。

aux_source_directory( )

例如:

aux_source_directory("./src/."  SRX_LIST)

6.添加头文件搜索路径

1.include_directories

指定所有目标的头文件路径。(为所有目标添加路径)

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])#目录会被添加到当前文件的 INCLUDE_DIRECTORIES属性中
#当前文件的每一个目标文件的 INCLUDE_DIRECTORIES属性也会添加该目录

2.target_include_directories

指定目标的头文件路径。(为一个目标添加路径,推荐)

target_include_directories( [SYSTEM] [AFTER|BEFORE] [items1...][ [items2...] ...])# 目标文件有INCLUDE_DIRECTORIES和 INTERFACE_INCLUDE_DIRECTORIES 两个属性
# INCLUDE_DIRECTORIES对内头文件目录
# INTERFACE_INCLUDE_DIRECTORIES 对外头文件目录

例如:

include_director(${PROJECT_BINARY_DIR})
target_include_directories(demo PRIVATE "${PROJECT_BINARY_DIR}")

为了VS中有.h文件

3.FILE

Readingfile(READ   [...])file(STRINGS   [...])file(  )file(TIMESTAMP   [...])Writingfile({WRITE | APPEND}  ...)file({TOUCH | TOUCH_NOCREATE} [...])file(GENERATE OUTPUT  [...])Filesystemfile({GLOB | GLOB_RECURSE}  [...] [...])file(RENAME  )file({REMOVE | REMOVE_RECURSE } [...])file(MAKE_DIRECTORY [...])file({COPY | INSTALL} ... DESTINATION  [...])file(SIZE  )file(READ_SYMLINK  )file(CREATE_LINK   [...])Path Conversionfile(RELATIVE_PATH   )file({TO_CMAKE_PATH | TO_NATIVE_PATH}  )Transferfile(DOWNLOAD   [...])file(UPLOAD   [...])Lockingfile(LOCK  [...])

产生一个匹配 的文件列表并将它存储到变量 中。文件名替代表达式和正则表达式相似,但更简单。如果 RELATIVE 标志位被设定,将返回指定路径的相对路径。结果将按字典顺序排序。

如果 CONFIGURE_DEPENDS 标志位被指定,CMake 将在编译时给主构建系统添加逻辑来检查目标,以重新运行 GLOB 标志的命令。如果任何输出被改变,CMake都将重新生成这个构建系统。

FILE(GLOB_RECURSE sources CONFIGURE_DEPENDS include/*.h)

4.target_sources

往可执行目标中添加源文件。

target_sources( [items1...][ [items2...] ...])
target_sources(demo PUBLIC ${sources})

7.库的生成和链接

创建加减乘除的动态库。
1.src下calc目录,calc目录创建文件
addition.h

int add(int x,int y)

addition.cpp

int add(int x,int y)
{return x + y;
}

subtract.h

int sub(int x, int y)

subtract.cpp

int sub(int x, int y)
{return x - y;
}

calc中也要构建CMakeList.txt。
CMakeList.txt构建过程添加如上文件
整体目录如下:

-demo
--src
----main.cpp
----CMakeList.txt
----calc
--------addition.h
--------addition.cpp
------subtract.h
------subtract.cpp
--------CMakeList.txt
--build

1.add_subdirectory

添加源文件目录。

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])# binary_dir 指定编译结果存放的位置

例如:
src下的CMakeList.txt需要添加

add_subdirectory(calc);

2.add_library

用指定的原文生成库。

add_library( [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][...])# STATIC 静态库
# SHARED 动态库
# 生成的库文件名为 lib.txt

calc下的CMakeList.txt中,写入:

add_library(addition STATIC addition.cpp)

但这个时候还不可以使用,还需要链接库

3.target_link_libraries

为目标库链接。

target_link_libraries( ...[ ...]...)# item 可以是target名。绝对路径(必须保证文件存在)

例如:
src下的CMakeList.txt需要添加:

target_link_libraries(demo PUBLIC addition)
target_include_directories(demo PUBLIC${PROJECT_BINARY_DIR}${PROJECT_SOURCE_DIR}/calc)

target_include_directories 需要添加头文件

整体文件图可见

cmake_minimum_required(VERSION 3.15)
project(demo)
FILE(GLOB_RECURSE sources CONFIGURE_DEPENDS include/*.h)
aux_source_directory("./src/." SRC_LIST)
add_library(demo STATIC ${SRC_LIST})
target_sources(demo PUBLIC ${sources})

相关内容

热门资讯

iphone7怎么重新恢复备份... iphone7怎么重新恢复备份目录iphone7怎么重新恢复备份如何进入iPhone7恢复模式苹果7...
日行一善经典语录 极速百科网 ... 日行一善经典语录目录日行一善经典语录日行一善经典语录一日行善或劝人行善的句子,谚语,名人名言神马都行...
同业是什么意思(同业业务的定义... 今天给各位分享同业是什么意思的知识,其中也会对同业业务的定义进行解释,如果能碰巧解决你现在面临的问题...
上海理工大学的王牌专业有哪些 ... 上海理工大学的王牌专业有哪些目录上海理工大学的王牌专业有哪些上海理工大学的王牌专业有哪些上海理工大学...
江畔独步寻花黄师塔前意思,江畔... 江畔独步寻花黄师塔前意思目录江畔独步寻花黄师塔前意思江畔独步寻花: 黄师塔前江水东........的...
妈祖诞辰日是哪一天,沿海地区信... 妈祖诞辰日是哪一天目录妈祖诞辰日是哪一天沿海地区信仰的妈祖生日是阴历几月几日?新历5月8号是妈祖生日...
人生四大喜事和四大悲剧是什么,... 人生四大喜事和四大悲剧是什么目录人生四大喜事和四大悲剧是什么莎士比亚四大喜剧,悲剧分别是什么人生四大...
pccp管是什么材料(pccp... 今天给各位分享pccp管是什么材料的知识,其中也会对pccp管图片进行解释,如果能碰巧解决你现在面临...
柴门闻犬吠的下一句是什么,“柴... 柴门闻犬吠的下一句是什么目录柴门闻犬吠的下一句是什么“柴门闻犬吠”下一句是什么?谢谢了,大神帮忙啊柴...
新三民和旧三民的内容是什么(新... 本篇文章极速百科给大家谈谈新三民和旧三民的内容是什么,以及新三民与旧三民的根本区别是什么对应的知识点...
LOL手机盒子怎么绑定,多玩L... 多玩LOL盒子每日竞技任务怎么绑定角色啊? 4. 登录成功后,在左下角找到“更多”按钮,点击“...
如何排序excel按字母,如何... 如何排序excel按字母目录如何排序excel按字母如何让excel按首字母排序?EXCEL工作表按...
朋友聚会的经典句子,朋友相聚的... 朋友聚会的经典句子目录朋友聚会的经典句子朋友相聚的经典句子关于聚餐的简短朋友圈说说有哪些?好友相聚的...
不客气英语怎么说 极速百科网 ... 不客气英语怎么说目录不客气英语怎么说不客气英语怎么说不客气英语怎么写不客气英文怎样表达?不客气英语怎...
企业分为居民企业和什么企业,《... 企业分为居民企业和什么企业目录企业分为居民企业和什么企业《中华人民共和国企业所得税法》规定,企业分为...
dlc啥意思,DLC是什么 新... dlc啥意思目录dlc啥意思DLC是什么 新人不懂请教大神们steam上的DLC分别是什么内容各种游...
imax和3d的区别(imax... 今天给各位分享imax和3d的区别的知识,其中也会对imax和3d电影有啥区别进行解释,如果能碰巧解...
福美来最不满意口碑-最不满意车... 本篇文章极速百科给大家谈谈福美来最不满意口碑-最不满意车主点评,以及福美来车子怎么样对应的知识点,希...
大众朗逸与明锐谁好大众朗逸与明... 本篇文章极速百科给大家谈谈大众朗逸与明锐谁好大众朗逸与明锐谁好,以及大众朗逸与明锐哪个性价比高对应的...
纹身百字歌诀谁有(纹身顺口溜歌... 今天给各位分享纹身百字歌诀谁有的知识,其中也会对纹身顺口溜歌诀表进行解释,如果能碰巧解决你现在面临的...
元凌卿是什么小说,前世辜负了痴... 元凌卿是什么小说目录《醉玲珑》大结局是什么?前世辜负了痴情的七王爷,重生后她不再任性叫什么名字女主叫...
忘年之交指怎样的朋友,忘年之交... 忘年之交指怎样的朋友目录忘年之交指怎样的朋友忘年之交指的是什么样的朋友?
披头士为什么叫甲壳虫(披头士和... 今天给各位分享披头士为什么叫甲壳虫的知识,其中也会对披头士和甲壳虫的区别进行解释,如果能碰巧解决你现...
白灵结局是什么,活佛济公里的白... 白灵结局是什么目录白灵结局是什么活佛济公里的白灵是个什么结局?活佛济公4白灵的结局白灵结局是什么呢?...
择天记电视剧结局,择天记结局 ... 择天记电视剧结局目录择天记电视剧结局择天记结局 大结局请查收电视剧《择天记》大结局是什么?落落结局为...
三星手机怎么录制屏幕视频,三星... 2. 在通知面板中,找到并点击
保险的基本知识有哪些,关于买保... 保险的基本知识有哪些目录保险的基本知识有哪些关于买保险的基本知识买保险,需要知道的基本知识保险的基础...
每次消防出警需要收费的吗,消防... 每次消防出警需要收费的吗目录每次消防出警需要收费的吗消防队出警灭火,需要交钱么?消防员出警要收费吗消...
14K金项链会掉色吗,k14项... 14K金项链会掉色吗目录14K金项链会掉色吗k14项链掉色正常吗?14K金子掉色吗?14k金会掉色吗...
如何正确的使用加湿器,加湿器怎... 如何正确的使用加湿器目录如何正确的使用加湿器加湿器怎么使用正确加湿器使用注意事项加湿器的正确使用方法...