没错,我又来了,由于我是java出身,所以idea是非常非常熟悉。于是,clion是我开发C++的首选,然而Clion支持Cmake,所以我就简单了解下。经了解,Clion适合于独立程序开发,但是如果是visual studio上的模板,还是用visual studio吧。
文章目录
1.概述
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。CMake 就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 [1]。在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
2.注释
- 单行注释:
#
- 多行注释:
#[[ ]]
3.命令
2.1cmake_minimum_required
- 语法:
cmake_minimum_required(版本号)
- 例如:
cmake_minimum_required (VERSION 2.8)
CMake 最低版本号要求
2.2project
- 语法:
project(项目名称)
# PROJECT 指令的语法是:
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
- 例如:
project (Demo2)
可以⽤来指定⼯程的名字和⽀持的语⾔,默认⽀持所有语⾔,例如可以通过
PROJECT (HELLO C CXX)
指定了⼯程的名字,并且⽀持语⾔是C和C++
2.3add_executable
- 语法:
add_executable(可执行文件名称,源文件列表)
- 例如:
add_executable(demo, main.cpp, demo.cpp)
指定指定的源文件列表生成可执行文件
2.4aux_source_directory
- 语法:
aux_source_directory(<dir> <variable>)
- 例如:
aux_source_directory(. DIR_SRCS);
该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名
2.5file
如果一个项目里边的源文件很多,在编写 CMakeLists.txt 文件的时候不可能将项目目录的各个文件一一罗列出来,这样太麻烦了。所以,在 CMake 中为我们提供了搜索文件的命令,他就是 file(当然,除了搜索以外通过 file 还可以做其他事情)。
- 语法:
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
- GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
- GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
2.6include_directories
在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译。在 CMake 中设置要包含的目录也很简单,通过一个命令就可以搞定了,他就是 include_directories:
2.7制作静态库或者动态库
2.7.1制作静态库
- 语法:
add_library(库名称 STATIC Makefile地址)
- 例子:
add_library(cale STATIC ${SRC_LIST})
在 Linux 中,静态库名字分为三部分:lib+ 库名字 +.a,在 Windows 中虽然库名和 Linux 格式不同,但也只需指定出名字即可。
2.7.2制作动态库
- 语法:
add_library(库名称 SHARED 源文件1 [源文件2] ...)
- 例子:
add_library(cale SHARED ${SRC_LIST})
在 Linux 中,动态库名字分为三部分:lib+ 库名字 +.so,此处只需要指定出库的名字就可以了,另外两部分在生成该文件的时候会自动填充。在 Windows 中虽然库名和 Linux 格式不同,但也只需指定出名字即可。
2.6set
2.6.1 语法:
# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(变量名 变量值 [CACHE TYPE DOCSTRING [FORCE]])
- 例如:
set(SRC_LIST main.cpp a.cpp b.cpp)
设置变量名
2.6.2 如何使用变量:`
${变量名}
2.6.3指定使用的C++版本
#增加-std=c++11
set(CMAKE_CXX_STANDARD 11)
#增加-std=c++14
set(CMAKE_CXX_STANDARD 14)
#增加-std=c++17
set(CMAKE_CXX_STANDARD 17)
- 在执行 cmake 命令的时候指定出这个宏的值(通常不用)
#增加-std=c++11
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=11
#增加-std=c++14
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=14
#增加-std=c++17
cmake CMakeLists.txt文件路径 -DCMAKE_CXX_STANDARD=17
2.6.4指定输出的路径
set(EXECUTABLE_OUTPUT_PATH 路径)
2.6.5变量操作
2.7message
- 语法:
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] 输出内容|变量)
- 例如:
message(WARNING "这是一个警告")
(无) = 重要消息;
STATUS = 非重要消息;
WARNING = CMake 警告, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
FATAL_ERROR = CMake 错误, 终止所有处理过程;
2.8链接静态库文件
先用link_directories包含库文件,再用link_libraries链接库文件
- 连接库语法:
link_libraries(<static lib> [<static lib>...])
- 参数1:指定出要链接的静态库的名字,可以是全名 libxxx.a,也可以是掐头(lib)去尾(.a)之后的名字 xxx
- 参数 2-N:要链接的其它静态库的名字
- 链接库文件语法:
link_directories(<lib path>)
2.9链接动态库文件
- 静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了。
- 动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存
- 语法:
target_link_libraries(可执行文件名称 库名称...)
- 可执行文件名称: 对应的是最终生成的可执行程序的名字
- 库名称:这是可执行程序要加载的动态库,这个库是系统提供的线程库,全名为 libpthread.so,在指定的时候一般会掐头(lib)去尾(.so)。
4.生成可执行文件
在window中,可以使用cmake软件或者clion,主要讲一下在linux中cmake的使用
- 执行cmake ./CMakeLists.txt所在的路径
需要注意的是,如果在不是CMakeLists.ext所在目录执行
cmake
,则会将Makefile编译在当前文件,这样方便管理(推荐)
- 生成Makefile后,执行make
- 生成可执行文件