2025年cmake教程(cmake教程 爱编程的大丙)

cmake教程(cmake教程 爱编程的大丙)p 有关 cmake 的入门简介可参见 p CMake 入门教程 cmake 静态 test c 编译 CSDN 博客 本文是进一步对 cmake 常用命令做进一步详述 作用 配置 cmake 最低版本 用法 作用 设置预设变量 PROJECT NAME PROJECT SOURCE DIR ROJECT BINARY DIR 用法 其中

大家好,我是讯享网,很高兴认识大家。



 <p>有关cmake的入门简介可参见</p> 

讯享网

CMake入门教程_cmake静态test.c编译-CSDN博客

本文是进一步对cmake常用命令做进一步详述

作用

配置cmake最低版本

用法

讯享网

作用:设置预设变量

  • PROJECT_NAME
  • PROJECT_SOURCE_DIR
  • ROJECT_BINARY_DIR

用法

 

其中,后边的c和cxx用于设置编译的语言,一般可以不用

案例:创建CMakeLists.txt,编写该文件内容,使用project命令设置项目名称,然后打印上述预设变量

讯享网

保存退出后,使用下述命令编译cmake

 
  • -S选项表示指定CMakeLists.txt文件的目录文件,后边的.表示当前目录
  • -B选项表示指定生成的文件存放在哪里

因此上述命令表示使用当前目录下的 CMakeLists.txt 生成Makefile文件等文件,并将生成的文件放到build文件夹内(注意build文件夹需要首先创建好)

运行结果


讯享网

上述命令中message函数可以帮助我们打印相关信息,如

讯享网
  • :打印一般信息,输出为绿色。
  • :打印警告信息,输出为黄色。
  • :打印错误信息并停止配置过程。

 同时可以设置 CMake 的调试输出,可以在命令行中设置 变量,以显示详细的构建命令。例如:

 

这将使 CMake 在执行构建时打印每个命令的详细信息。

添加头文件搜索路径的命令有两种

  • include_directories:指定的头文件路径会被应用于整个 CMakeLists 文件中所有后续的目标
  • target_include_directories:允许你为特定的目标(例如库或可执行文件)设置头文件路径

 以下是两种方式使用代码实例

讯享网

该代码表示整个项目所有源文件的自定义头文件搜索路径都指定为include 

 

而该代码表示仅为目标文件app中包含的自定义头文件搜索路径指定为include

target_include_directories命令的语法格式为

讯享网

 如上所示,该命令会为指定的头文件添加三个属性

  • INTERFACE
  • PUBLIC
  • PRIVATE

要理解上述三个属性的区别,首先要知道,Cmake会为每个目标文件设置两个属性,分别是

  • INCLUDE_DIRECTORIES:只在当前目标文件中有效
  • INTERFACE_INCLUDE_DIRECTORIES:随着目标文件的依赖而传播

上述两个属性的区别在于:

  • 如果使用PRIVATE,则只会在INCLUDE_DIRECTORIES属性中添加头文件搜索路径
  • 如果使用INTERFACE,则只会在INTERFACE_INCLUDE_DIRECTORIES属性中添加头文件搜索路径
  • 如果使用PUBLIC,则相当于同时使用INCLUDE_DIRECTORIES和INTERFACE_INCLUDE_DIRECTORIES

 如下所示,如果使用PRIVATE,则每个目标文件(在这里是base和app)的头文件的搜索路径包含在各自维护的INCLUDE_DIRECTORIES变量里 

 

但是如果使用的是PUBLIC,那么util的路径就会被同时存储在INTERFACE_INCLUDE_DIRECTORIES变量里,同时这个路径会跟随base这个目标文件存在,因此当第二个target_include_directories包含base的时候,base就已经包含了util路径,将不再需要单独列出这个路径了

讯享网

添加可执行程序的命令为

 

app为最后编译成功的可执行程序,main.cc表示编译这个可执行程序需要的源文件,而可选项EXCLUDE_FROM_ALL 表示将可执行程序app2排除在all之外,需要明确指定才能编译

EXCLUDE_FROM_ALL 这个可选项什么意思呢?

我们在CMakeLists.txt文件中写入以下内容

讯享网

然后执行

 

首先进入build文件夹

先执行

讯享网

可以看到,此时使用make,仅仅只编译了app,并未编译app2 

事实上,make命令其实执行的是make all

接下来我们重新执行

 

可以看到,由于EXCLUDE_FROM_ALL 的作用,我们在使用make命令编译时,必须手动指明要编译的目标文件名

如果要编译库文件,则使用的命令是

讯享网

其使用方式与add_executable一样,只是库文件有静态库和动态库之分,因此add_library命令有一个可选项用于指定编译动态库还是静态库,默认情况下不指定选项时编译为静态库

 

如上述命令表示将   mprpcapplication.cpp文件编译为静态库

而如果要编译为动态库,则需要指定为

讯享网

引用库文件时使用命令

 

比如以下命令,表示我要编译生成一个静态库文件mprpc,而这个库文件在编译时要依赖于其他的第三方库,这是就需要使用target_link_libraries命令

讯享网

小讯
上一篇 2025-05-26 08:43
下一篇 2025-05-17 17:54

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/162406.html