cmake命令行参数(CMake (三)cmake 在工程中的用法)

:暂无数据 2026-10-23 00:00:01 :0

cmake命令行参数(CMake (三)cmake 在工程中的用法)

本篇文章给大家谈谈cmake命令行参数,以及CMake (三)cmake 在工程中的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

CMake (三)cmake 在工程中的用法

1.外部编译的一个实例:

对于 cmake,内部编译在CMake(一)已经演示过了,它生成了一些无法自动删除的中间文件,所以, 引出了我们对外部编译的探讨,外部编译的过程如下:
1,首先,请清除t1目录中除main.c CmakeLists.txt之外的所有中间文件,最关键 的是 CMakeCache.txt。
2,在t1目录中建立build 目录,当然你也可以在任何地方建立build目录,不一定必 须在工程目录中。
3,进入build目录,运行cmake ..(注意,..代表父目录,因为父目录存在我们需要的 CMakeLists.txt,如果你在其他地方建立了build目录,需要运行cmake 《工程的全 路径》),查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间 文件.
4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。
上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没 有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外颂孝部编 译方式构建工程。

贴图(tree图如下)

目录结构是: CMakeLIsts.txt 放在工程的顶层目录下,而建立build, 然后cmake 生成的中间文件会自动放到build 目录下,Cmake的中间文件不能通过make clean 自动删除,这种方式手动删除的时候比较便利。

2.建立src 目录,把所有的source 文件都挪到src 下面去, bin 里面的文件则是自动生成的。
CMakeLists.txt 文件如下:

编译:

这里要注意的是ADD_SUBDIRECTORY,如果把source 移入到Src,然后编译的时候会出错,说无法再src下面找到CMakeLIsts.txt文件,这里的处理是用SET()方法指定了source 的路径才过的,而ADD_SUBDIRECTORY暂时没有用。

**1)以下是一些说明,还需要慢慢体会用法的精妙之处。
ADD_SUBDIRECTORY 指令ADD_SUBDIRECTORY(source_dir )
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存 放的位置。EXCLUDE_FROM_ALL 参数的含义是将这中春个目录从编译过程中排除,比如,工程 的 example,可能就需要工程构建完成后,再进入 example 目录单独进行构建(当然,你 也可以通过定义依赖来解决此类问题)。

**2) 关于要从src 中找CMakeLists.txt 我一直觉得比较反人类,看了一些成熟项目的make 结构,src 下面也没有放这个文件。但为什么参考资料里面没有提要做SET的设定,或许是cmake 的版本不同?

加了最后两行
形成的工程文件如下,静态库.a在lib中生成。

同理可以生成动态库,省野培稿略,

source code:
***隐藏网址***

追记:
cmake 的整合,以及其他功能还是在以后使用中再看,以下是一些参考的link:
***隐藏网址***

***隐藏网址***

cmake中怎样设置gcc的编译参数

在configure的时候碧闭,加上–悔早裂host=arm-linux,结果没有实现我们要睁咐的效果,没有将编译器从默认的 gcc改成arm-linux-gcc,编译器还是用的默认的gcc: $ CFLAGS=-O2

深入理解CMake(3):find_package()的使用

created in 2019-03-03 11:44:11
updated in 2019-3-28 14:31:21

前面两篇从cmake源码中命令行入口参数、简虚Caffe源码顶层CMakeLists.txt进行了解读,整体有了一个印象。在此基础上,考虑实际中最常遇到的问题:基于CMake构建Caffe,如何确保每一个依赖被正确找到?尽管用了CMake用了 find_package() ,也看到了Caffe官方的CI构建脚本 scripts/install-deps.sh ,但是自己机器不是docker环境、如何切换多个版本的依赖包?

find_package() 命令是用来查找依赖包的,理想情况下,一句 find_package() 把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。但实际中往往CMake失败就是出在 find_package() 的失败上(这里不考虑后续make/nmake/msbuild以及编译器、链接器直接执行时的编译、链接出错,只讨论cmake根据CMakeLists.txt执行时候的情况),例如:

上面列出的opencv和protobuf是重灾区,还有没有列出来的比如boost版本问题等。解决起来也不难:

根据cmake官方文档可以知道, find_package() 有Module模式(基本用法,basic signature)和Config模式(full signature,完全用法),其中Module模式是基础,Config模式则更复杂高级些。

Module模式也就是基础用法(Basic Signature,这里Signature表示“用法”,而不是“签名”),Config模式也就是高级用法(Full Signature)。

也就是说,只有这3种情况下才是Config模式:

换句话说,只要我不指定"CONFIG",不指定“NO_MODULE",也不使用"full signature"中的关键字,那我就是在Module模式。 排查 find_package() 的第一步,应当判断它是Module模式还是Config模式 。

Module模式下,相比于Config模式,可选配置参数少一些,并且如果按用户指定的配置却找不到包,就会自动进入Config模式(如上图所示)。

关键字解释
version 和 EXACT : 都是可选的, version 指定的是版本,如果指定就必须检查找到的包的版本是否和 version 兼容。如果指定 EXACT 则表示必须完全匹配的版本而不是兼容版本就可以。

QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了 REQUIRED 字段,则 QUIET 无效,仍然洞神会输出查找失败提示语)。

MODULE 可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了 MODULE 选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。

REQUIRED 可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定 REQUIRED 则cmake会继续执行。

COMPONENTS , components :可纳咐亏选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于 REQUIRED ,导致cmake停止执行。

OPTIONAL_COMPONENTS 和 components :可选的模块,找不到也不会让cmake停止执行。

Module模式查找顺序
Module模式下是要查找到名为 Find《PackageName》.cmake 的文件。

先在 CMAKE_MODULE_PATH 变量对应的路径中查找。如果路径为空,或者路径中查找失败,则在cmake module directory(cmake安装时的Modules目录,比如 /usr/local/share/cmake/Modules )查找。

Config模式下的查找顺序,比Module模式下要多得多。而且,新版本的CMake比老版本的有更多的查找顺序(新增的在最优先的查找顺序)。它要找的文件名字也不一样,Config模式要找 《PackageName》Config.cmake 或 《lower-case-package-name》-config.cmake 。查找顺序为:

实际上会找到opencv300,也就是 OpenCV_DIR 这一cmake变量的值最先起作用。

cmake交叉编译参数toolchain

CMake给交叉编译预留了一个很好的变量即 CMAKE_TOOLCHAIN_FILE ,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括 C_COMPILER , CXX_COMPILER 。CMake为了不让用户每次交叉编译都要重新输入这些命令高纤,因此它带来toolChain机制,简而言之就是一个cmake脚本,内嵌了你需要改变以戚滑仿及需要set的所有让镇交叉环境的设置。

这里面也牵扯了一些相关的变量设置,在这里我通过自己的项目,简单介绍下几个比较重要的:

添加链接参数

买火车票、高铁票、机票,订酒店都打9折的出行工具TRIP, 点击注册

Cmake与MinGW配合使用

安装MinGW,配置环境变量 :..\mingw32\bin

把 :..\mingw32\bin\mingw32-make.exe 改名为 make.exe(个人喜好,方便后边编译)

安装肢空Cmake配置环境变量:.../Cmake/bin
Cmake-GUI使用:

选择路径:

source code:CMakeLists.txt文件所在的目录

build to bin:编译中间结果所在的位置

然后点击 config》》选择 MinGW makefile》》选择本地编译器》》选择位置》》点击确定》》等待配置完毕》》点击 generate》》生成makefile文件》》在此处打开cmd》》make命令(实质上是调用了 MinGW的make.exe)
Cmake命令行使用:

-G 指明生成的Makefile格式

-D 添加参数

-S 指明源码位置

-B 指明输出路径历衡瞎

例如:

cmake -G "MinGW Makefiles" -S "源码路径" -B "输出路径"

或拦誉者

cmake -G "MinGW Makefiles" -D CMAKE_TOOLCHAIN_FILE="编译工具链路径" -S "源码路径" -B "输出路径"

注意:Cmake是不支持中文的,无论是GUI还是命令行,都严禁出现中文字符.

linux 源码安装 cmake 时 可选的参数有哪些

  /configure就是执行你当前目录下一个卖做名叫configure的凯乱脚本,由它生中孙衡成Makefile,有了Makefile之后,一般来说就可以通过make进行编译,make install进行安装
  cmake就是一个与make同级别的编译工具,只不过它依靠的不是Makefile作为编译规则,而是根据CMakeLists.txt来编译的。

cmake使用方法(详细)

例子

在 cmake 脚本中,设置编译选项可以通过 add_compile_options 命令,也可以通过 set 命令修改 CMAKE_CXX_FLAGS 或 CMAKE_C_FLAGS 。
使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:

例子

也可以直接在编译的时候指定:

语法

待补充

语法

在CMake中基础的数据形式是字符串。CMake也支持字符串列表。

列表通过分号分隔。譬如两个声明给变量VAR设同样的值:

字符串列表可以通过foreach命令迭代或直接操控列表命令。

CMake 支持简单的变量可以是字符串也可以是字符串列表。变量参考使用 ${VAR} 语法。多参数可以使用 set 命令组合到一个列表中。所有其他的命令

通过空白分隔符传递命令来扩展列表,例如

像大多数语言一样,Cmake 提供了控制流结构。Cmake提供了三中控制流:

更多控制流信息参见命令 if,while,foreach,macro,function文档。

在CMake中原义字符串用双引盯隐号括起来。字符串可以是多行字符串,并在其中嵌入新的行。例如

也可以在一个字符串中转义字符和使用变量

同样支持标准C中的转义

如果字符在引号之前是空格则原义字符串只是原义字符串。但是引号必须成对,例如

cmake可以使用正则表达式

cmake project 头文件必须存在这行命令, 例如 cmake_minimum_required(VERSION 3.10)

设置项目名称 project(Tutorial)

语法

例子

语法

将指定的源文件(CPP文件)生成链接文件,然后添加到工程中去。

语法

其中 《name》 表示库文件的名字,该库文件会根据命令里列出的源文件来创建。而 STATIC 、 SHARED 和 MODULE 的作用是指定生成的库文件的类型。

例子

在子文件夹添加了 library 或者 executable 之后,在上层目录添加 subdirectory , 也可以在同一个CMakeList.txt中使用

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

语法:

它相当于 g++ 命令的 -L 选项的作用,也相当于环境变量中增加 LD_LIBRARY_PATH 的路径的作用。
语法:

语法:

该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定搏枣该目录的路径以便工程能够找到。

语法:

link_libraries(library1 《debug | optimized》 library2 ...)

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

语法:

语法:

简单的例子如下:

一凯银厅般情况下, make install 在不指定 prefix 默认安装在`/usr/local/bin

cmake 后面那些参数该怎么写

在工程搭建时,可能会有将静态库链接成动态库的需求,如出于代码保护的角度,某些模块会发布.a扩展名的静态库,我们要将多个这样的静态库链接成一个动态库。但与盯铅直接link目标文件不同的是,ld以默认参数执行时,并把静态库中没有用到的函数过滤掉,导致生成的so并未包含所要的函数,因此要加上--whole-archive参数,以保凯乱好证所有的函数都包含在生成的so中。 在使用cmake时,CMakeLists.txt的写法如下:add_library( ${MODULE_NAME} SHARED ${CMAKE_SOURCE_DIR}/builttime.c #要生成一个so,至少要包陪简含一个源文件,实在没有可以把库的编译时间戳打到这儿。)target_link_libraries( ${MODULE_NAME} ${${MODULE_NAME}_EXTRA_LDFLAGS} "-Wl,--whole-archive" #告诉编译器,从这里开始,所有的库的内容都包含到so中 ${LOCAL_MODULES} #可以是以源代码生成的静态库 ${PREBUILT_MODULES} #可以是预先生成的静态库 "-Wl,--no-whole-archive" #告诉编译器,从这里开始,以后的库的内容不用都包含到so中)

Cmake中find_package命令的搜索模式之配置模式(Config mode)

  前面有介绍过 find_package 的两种搜索模式之一模块模式(请参考 Cmake命令之find_package介绍 和 模块模式 ),本文将介绍另外一种模式:配置模式。

  该模式下, CMake 会搜索 《lowercasePackageName》-config.cmake 文件或 《PackageName》Config.cmake 文件。如果 find_package 命令中指定了具体的版本,也会搜索 《lowercasePackageName》-config-version.cmake 或 《PackageName》ConfigVersion.cmake 文件,因此配置模式下通常会提供配置文件和版本文件(注意形式上要保持一致),并且作为包的一部分一起提供给使用者。

 缺丛 同样的,当 find_package 调用返回时,一系列跟包相关的变量也会提供给调用者。例如 《PackageName》_FOUND 标识包是否找到、 《PackageName》_DIR 变量用于指示包配置文件所在的位置。实际上,返回的变量并没有特别的限制,但是还是建议遵循 模块模式 的标准变量名称的命名规则。

  一个配置文件方式提供的包由 包配置文件 (必须包含,名为 《lowercasePackageName》-config.cmake 文件或 《PackageName》Config.cmake )和 包版本文件 (可选,名为 《lowercasePackageName》-config-version.cmake 或 《PackageName》ConfigVersion.cmake )组成。配置文件和版本文件的命名要配对出现,也就是:

或者是:

  仍然是以我们自己编写的 mymath 库为例,假设 mymath 库提供了如下的文件:

   mymathConfig.cmake 文件有两种方式可以生成:

  可以参考 Cmake命令之find_package介绍 的伏早樱 4.1 章节查看 .cmake 文件的搜索路径,我们的例子将在 find_package 中通过 PATHS 来指定。

   find_package 找到一个配置文件后,会尝试去查找版本文件。版本文件的主要作用是用来验证包的版本是否与 find_package 命令中指定的版本信息匹配。如果匹配的话,就会使用配置文件中的内容,否则会忽略配置文件中的内容。

  和配置文件一样,版本文件也有两种方式生成:

  当 find_package 命令在加载版本文件时,首先会通过从 find_package 中得到的版本信息设置睁毁如下变量,用于版本文件中版本对比:

  在版本文件中可以使用上述变量来检查版本的兼容性、版本是否匹配,并设置如下变量作为返回结果:

   find_package 会检查上述变量,如果版本匹配成功,那么 find_package 会返回如下变量给调用者:

   mymath 库的 CMakeLists.txt 内容如下:

  在命令行中执行 cmake . 和 make 生成 libmymath.a 库。

   mymath 库及其提供的 .cmake 配置文件见本文的第二章节。下面来编写测试文件:

  在命令行中执行 cmake . 和 make 生成 test 可执行文件并执行 ./test ,对应的输出结果如下(摘取重要部分呈现):

文章分享结束,cmake命令行参数和CMake (三)cmake 在工程中的用法的答案你都知道了吗?欢迎再次光临本站哦!

cmake命令行参数(CMake (三)cmake 在工程中的用法)

本文编辑:admin

更多文章:


csvwrite函数(matlab保存csv遇到的问题)

csvwrite函数(matlab保存csv遇到的问题)

“csvwrite函数”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看csvwrite函数(matlab保存csv遇到的问题)!

2026年10月23日 04:30

jquery动态添加表格行(如何通过jquery动态给表格添加一行)

jquery动态添加表格行(如何通过jquery动态给表格添加一行)

其实jquery动态添加表格行的问题并不复杂,但是又很多的朋友都不太了解如何通过jquery动态给表格添加一行,因此呢,今天小编就来为大家分享jquery动态添加表格行的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年10月23日 00:30

cmake命令行参数(CMake (三)cmake 在工程中的用法)

cmake命令行参数(CMake (三)cmake 在工程中的用法)

本篇文章给大家谈谈cmake命令行参数,以及CMake (三)cmake 在工程中的用法对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年10月23日 00:00

游戏代码翻译器下载(求游戏实时翻译软件)

游戏代码翻译器下载(求游戏实时翻译软件)

“游戏代码翻译器下载”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看游戏代码翻译器下载(求游戏实时翻译软件)!

2026年10月22日 23:50

linux数据备份命令(Linux系统下常用的数据备份方法有哪些)

linux数据备份命令(Linux系统下常用的数据备份方法有哪些)

大家好,今天小编来为大家解答以下的问题,关于linux数据备份命令,Linux系统下常用的数据备份方法有哪些这个很多人还不知道,现在让我们一起来看看吧!

2026年10月22日 23:20

小程序开发平台开源(有哪些快速开发平台或者零代码开发平台)

小程序开发平台开源(有哪些快速开发平台或者零代码开发平台)

大家好,如果您还对小程序开发平台开源不太了解,没有关系,今天就由本站为大家分享小程序开发平台开源的知识,包括有哪些快速开发平台或者零代码开发平台的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

2026年10月22日 23:10

executequery返回值(ExecuteQuery(sql)的返回值)

executequery返回值(ExecuteQuery(sql)的返回值)

大家好,executequery返回值相信很多的网友都不是很明白,包括ExecuteQuery(sql)的返回值也是一样,不过没有关系,接下来就来为大家分享关于executequery返回值和ExecuteQuery(sql)的返回值的一些

2026年10月22日 23:00

web个性布局模板(FrontPage简明教程:网页布局)

web个性布局模板(FrontPage简明教程:网页布局)

各位老铁们,大家好,今天由我来为大家分享web个性布局模板,以及FrontPage简明教程:网页布局的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年10月22日 22:50

舍曲林吃了一周越来越严重(我母亲77岁,服用舍曲林一周,开始半片,4天后改为1片,第三天开始失眠,第四天出现乏力、食欲下降,)

舍曲林吃了一周越来越严重(我母亲77岁,服用舍曲林一周,开始半片,4天后改为1片,第三天开始失眠,第四天出现乏力、食欲下降,)

本篇文章给大家谈谈舍曲林吃了一周越来越严重,以及我母亲77岁,服用舍曲林一周,开始半片,4天后改为1片,第三天开始失眠,第四天出现乏力、食欲下降,对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所

2026年10月22日 21:00

flash player电脑版下载(FLASH PLAYER在哪下能安全的下载呢)

flash player电脑版下载(FLASH PLAYER在哪下能安全的下载呢)

这篇文章给大家聊聊关于flash player电脑版下载,以及FLASH PLAYER在哪下能安全的下载呢对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年10月22日 19:20

最近更新

青海白帽seo技术怎么入门?
2026-10-23 04:40:20 浏览:0
热门文章

wait for you杨和苏(大家听下(wait for you)这首英文歌的开头那段音乐)
2026-06-13 16:20:04 浏览:26
刷关键字排名怎么操作最有效?
2026-09-14 20:02:13 浏览:20
标签列表