当前位置: 首页 > news >正文

cmake常用命令学习

1.include

https://blog.csdn.net/qq_38410730/article/details/102677143

CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被includeCMakeLists.txt中。

include指令一般用于语句的复用,也就是说,如果有一些语句需要在很多CMakeLists.txt文件中使用,为避免重复编写,可以将其写在.cmake文件中,然后在需要的CMakeLists.txt文件中进行include操作就行了。

include(file|module)

.cmake文件里包含了一些cmake命令和一些宏/函数,当CMakeLists.txt包含该.cmake文件时,当编译运行时,该.cmake里的一些命令就会在该包含处得到执行,并且在包含以后的地方能够调用该.cmake里的一些宏和函数。

之后有机会再了解什么事宏和函数。

2.protobuf_generate_cpp

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)

将foo.proto文件生成源码,使用PROTO_SRC,PROTO_HARS变量分别指代生成的cpp和h文件并可用于连接到target和设置include。

要求protobuf_generate_cpp命令和生成add_executable() 或 add_library() 的命令必须在同一个CMakeList中.

 3.file命令

file(GLOB variable [RELATIVE path] [globbingexpressions]...)

file GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件。GLOB 会产生一个由所有匹配globbing表达式的文件组成的列表,并将其保存到变量中。(如果指定了RELATIVE 标记,返回的结果将是与指定的路径相对的路径构成的列表。)

如果没有写正则表达式,那么什么文件都匹配不到。例子:

file(GLOB files  *)// 会把文件和文件夹都包含进来
foreach(file IN LISTS files)message(STATUS ${file})
endforeach(file)

例子,注意要用双引号,cmake不支持单引号:

打印结果,目录和文件是同等地位,被包含进来:

这段代码的意思是挑选出当前文件下的所有文件,然后打印。

file(MAKE_DIRECTORY [directory1 directory2 ...])

MAKE_DIRECTORY在指定目录处创建子目录,如果它们的父目录不存在,也会创建它们的父目录。

5.add_subdirectory

https://www.jianshu.com/p/07acea4e86a3,添加一个子目录并构建该子目录。

add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])# 绝对路径或当前目录的相对路径 []是可选参数

binary_dir,指定文件输出存放路径。

6.自带变量

https://blog.csdn.net/wzj_110/article/details/116674655, https://juejin.cn/post/6844903999448055815

内置变量

CMAKE_CURRENT_LIST_DIR: 当前处理的'cmake或CMakeListst.txt文件'所在的目录

CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 文件所在的路径。 

PROJECT_SOURCE_DIR:项目源文件的目录,如果直接在代码目录下cmake,那么此变量与PROJECT_BINARY_DIR内容相同;

PROJECT_BINARY_DIR:可执行文件的目录。

7.function用法

https://blog.csdn.net/qq_38410730/article/details/102677143

function(<name> [arg1 [arg2 [arg3 ...]]])COMMAND1(ARGS ...)            # 命令语句COMMAND2(ARGS ...)...
function()

 可以用${arg1}来引用变量。当宏和函数调用的时候,如果传递的是经set设置的变量,必须通过${}取出内容。

function(Foo arg)set(${arg} "abc" PARENT_SCOPE)message("# After change the value of arg.")message("arg = ${arg}")
endfunction()
message("=== Call function ===")
Foo(test)message("test value = ${test}")//CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
include(test.cmake)

 打印结果

=== Call function ===
# After change the value of arg.
arg = test  //不太明白这里为什么是test值?
test value = abc

 总之在CMakeLists访问变量就带上${}。

8.add_library() 

add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][source1] [source2 ...])# Normal Libraries
  • 添加名为name的库,name全局唯一;
  • 库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一,生成的library名会根据STATICSHARED成为name.aname.lib;默认是STATIC选项。
add_library(<name> OBJECT [<source>...]) # Object Libraries

创建对象库(Object Library).对象库编译源文件,但不会将其存档或链接到库中。由add_library命令或add_executable命令创建的其它目标可以使用$<TARGET_OBJECTS:objlib>形式的表达式作为源来引用对象,其中objlib是对象库名称。

9.include_directories()

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 …]) //默认是AFTER

将指定目录添加到编译器的头文件搜索路径之下。相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用.

使用SYSTEM选项,会把指定目录当成系统的搜索目录。

10.get_filename_component

https://blog.csdn.net/wzj_110/article/details/116431616

cmake获取'文件名'的'特定'部分。

 路径+文件名。

11.add_executable

https://blog.csdn.net/MacKendy/article/details/122549819

基于特定的源文件,创建可执行文件,名为<name>或者<name>.exe(根据平台不同,带exe后缀的是win平台)。

 创建名为<name>的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]…。

https://www.cnblogs.com/dbai/p/17209898.html,add_executable的3种写法,一种是最基础麻烦的,第二是用file命令,第三种是aux但头文件要单独加。

12.aux_source_directory

//语法:
aux_source_directory(<dir> <variable>)//例子:
//# 查找目录下的所有源文件
//# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)

13.target_include_directories

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

该命令可以指定目标(exe或者so文件)需要包含的头文件路径。命名的<目标>必须是由add_executable()或add_library()之类的命令创建的,并且不能是ALIAS目标。

14.add_dependencies

add_dependencies(<target> [<target-dependency>]...)

明确依赖关系:始终在CMakeLists.txt中明确指定目标间的依赖关系,避免隐式依赖。

例子:【cmake 基础小知识】如何在CMake项目中使用add_dependencies命令管理目标依赖关系-阿里云开发者社区

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用PXE和kickstart完成自动化批量主机的安装
  • C#中重写tospring方法
  • vector中 resize()和reserve()
  • 对比state和props的区别
  • Anaconda的一些常见命令
  • 卷积神经网络 - 卷积与池化作为一种无限强的先验篇
  • AI智能名片小程序在促销性内容营销中的创新应用与策略分析
  • 数据结构(8):排序
  • 强光照射对半导体材料在紫外线下稳定性的影响
  • AutoDL下huggingface下载模型位置问题
  • Java之类和对象
  • 手机三要素接口怎么对接呢?(一)
  • 【AI大模型】大模型应用开发学习线路
  • Mysql的聚集索引、散列度、联合索引以及回表和覆盖索引
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • 【翻译】babel对TC39装饰器草案的实现
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • android图片蒙层
  • Github访问慢解决办法
  • HTTP中GET与POST的区别 99%的错误认识
  • Js基础知识(一) - 变量
  • Linux后台研发超实用命令总结
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 理解在java “”i=i++;”所发生的事情
  • 前端相关框架总和
  • 运行时添加log4j2的appender
  • 找一份好的前端工作,起点很重要
  • 移动端高清、多屏适配方案
  • ​用户画像从0到100的构建思路
  • ![CDATA[ ]] 是什么东东
  • #DBA杂记1
  • #stm32整理(一)flash读写
  • (52)只出现一次的数字III
  • (C#)获取字符编码的类
  • (javascript)再说document.body.scrollTop的使用问题
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (LeetCode C++)盛最多水的容器
  • (libusb) usb口自动刷新
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pojstep1.3.1)1017(构造法模拟)
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (回溯) LeetCode 40. 组合总和II
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (未解决)macOS matplotlib 中文是方框
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 中viewstate的原理和使用
  • .NetCore 如何动态路由
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • @EnableAsync和@Async开始异步任务支持
  • @基于大模型的旅游路线推荐方案
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能