一个java程序员的CMake之旅

没错,我又来了,由于我是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
  • 生成可执行文件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值