当前位置:网站首页 > 云服务教程 > 正文

cmake教程菜鸟(cmake documentation)



​​

全栈工程师开发手册 (作者:栾鹏)
​​ 架构系列文章​​


一、 基本使用

安装:下载二进制包后可直接解压使用

从源码安装则执行命令:https://blog.51cto.com/u_/bootstrap; make; make install——尝试执行bootstrap失败

使用:cmake dir_path,生成工程文件或makefile文件

三、 基本结构

1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;

2,在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录

3,子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)

Cmake的输入是在源码目录下的CMakeLists.txt文件。这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件。

语法

CMakeList.txt文件是由注释、命令和空白字符组成。

注释是由 # 开始,到行结尾。

命令是由:命令名、(、空格分隔的参数、)组成。

例如:command (args….)

上面的command可以是一个命令名;或者是一个宏;也可以是一个函数名。

args是以空格分隔的参数例表(如果参数中包含空格,则要加双引号)

除了用于分隔参数的空白字符(空格、换行号、tabs)都是被忽略不计的。任何包含在双引号中的字符都做为一个参数。一个反斜杠用于转换码。

命令名是大小写不敏感的。

字符串(string)和字符串列表(lists)

CMake的基本数据类型是字符串(string)。CMake也支持由字符串组成的字符串列表。字符串列表可以由;或空格分隔的组成。例如:下面设置变量var是等效的。

字符串列表可以用 foreach命令叠代(iterated)或list命令操作

变量

CMake支持简单的变量:字符串或字符串列表。用${VAR} 语法得到变量的引用。

可以用一个set命令把一个字符串列表设置为一个变量,然后把这个变量传递给需要传递多参数的函数。例如:

如果你想传把一个字符串列表做为一个单独的参数传递给函数,用双引号包含它。例如:

环境变量:

用$ENV{VAR}得到环境变量的引用

设置环境变量:

程序流控制

CMake提供三种程序流控制结构:

1、 条件声明:if

2、 循环控制:foreach 和 while

3、 程序定义:宏或函数(函数在CMake2.6以后的版本才支持)。函数建立本地范围内的变量,宏用于全局范围内。

函数可以返回,可以用 return()命令返回。如果要从函数中返回值,只能通过参数返回:

set命令中 PARENT_SCOPE表示传递给函数调用者所拥有的变量

引号、字符串和escapes

一个用双引号包含的字符串,是这个字符串的字面含义。一个字符串能包含多行。例如:

也能在字符串中用转义字符

标准C的转义字符被支持

引号必须是匹配的

正则表达式

一些CMake命令(如if和 string),能使用正则表达式或使用正则表达式作为参数。一个简单的形式,一个正则表达式用于在一个序列的字符串中精确查找一个字符。然而在大多时候,一个精确查找是不知道的或者只是匹配最前或者最后字符。所以这里用正则表达式进行不同的转换。Cmake标准是可被描述的。这个描述是基于开源的正则表达式类(Texas Instruments)。

内部变量

CMAKE_C_COMPILER:指定C编译器

CMAKE_CXX_COMPILER:

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release, …),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

内置变量的使用:

在CMakeLists.txt中指定,使用set

cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

命令

project (HELLO) #指定项目名称,生成的VC项目的名称;

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

add_subdirectory:包含子目录

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

add_definitions:添加编译参数

target_link_libraries:添加链接库,相同于指定-l参数

add_library:

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( … ): lots of properties… OUTPUT_NAME, VERSION, …

link_libraries( lib1 lib2 …): All targets link with the same set of libs

先制作makefile文件 以便以后运行

CMakeLists.txt文件内容如下:

其中 link_directories为指定优先搜索库的路径,也就是.so文件的路径 默认搜索 /usr/local/lib目录,
该目录下有很多.so目录 include_directories为包含的unclude目录.
add_executable参数为要生成的可执行文件的文件名, 要编译的cpp/h文件
target_link_libraries为在lib目录下(包含系统lib目录/usr/local/lib和手动添加目录link_directories,)要包含的.so文件名.其中去掉文件名前面的lib字符串 当多个库存在依赖时,依赖库要写在后面 如果你添加了目标库,但是没有添加目标库的依赖库,就会报错,这个时候你需要将缺少的库也添加到target_link_libraries里面
注意:库的名称是.so文件的文件名去掉前面的lib字符串

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

编写 CMake 配置文件 CMakeLists.txt 。

使用 make 命令进行编译。

在CMakeLists.txt目录下执行

这样就可以生成可执行文件了

1, 添加头文件目录INCLUDE_DIRECTORIES

语法:

它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

2, 添加需要链接的库文件目录LINK_DIRECTORIES

语法:

3, 查找库所在目录FIND_LIBRARY

4, 添加需要链接的库文件路径LINK_LIBRARIES

语法:

可以链接一个,也可以多个,中间使用空格分隔.

5, 设置要链接的库文件的名称TARGET_LINK_LIBRARIES

语法:

6,为工程生成目标文件

语法:

简单的例子如下:

7, 最后贴一个完整的例子

另外,使用cmake生成makefile之后,make edit_cache可以编辑编译选项。

到此这篇cmake教程菜鸟(cmake documentation)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

  • 上一篇: win11虚拟机安装教程(虚拟机安装won11)
  • 下一篇: 没有了
  • 版权声明


    相关文章:

  • win11虚拟机安装教程(虚拟机安装won11)2025-01-24 21:54:08
  • 启动盘u盘制作教程视频(u盘启动盘制作步骤视频)2025-01-24 21:54:08
  • 启动盘u盘制作方法视频(启动u盘制作教程)2025-01-24 21:54:08
  • gmock教程(gmclock)2025-01-24 21:54:08
  • u盘制作系统盘教程win10(系统u盘制作方法win10)2025-01-24 21:54:08
  • git操作教程(git的操作)2025-01-24 21:54:08
  • 25q256jvfq如何烧录(25q128fvsg烧写教程)2025-01-24 21:54:08
  • 华为模拟器ensp考试(华为模拟器ensp下载与安装教程)2025-01-24 21:54:08
  • u盘镜像安装系统操作步骤(u盘镜像装系统教程)2025-01-24 21:54:08
  • cmake教程(cmake教程 多层目录)2025-01-24 21:54:08
  • 全屏图片