首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CMake 秘籍(六)

CMake 目标是对构建系统将要执行的操作非常有用的抽象。使用PRIVATE、PUBLIC和INTERFACE关键字,我们可以设置同一内的目标将如何相互作用。...实际上,这让我们定义了目标 A 的依赖将如何影响依赖于 A 的目标 B。当其他项目想要将一个库作为依赖使用时,可以充分体会到这种机制的强大之处。...如果库维护者提供了适当的 CMake 配置文件,那么所有依赖都可以很容易地用很少的 CMake 命令来解决。...我们将单独分析message-shared目标的 CMake 命令,但这里的讨论是通用的: 在项目构建中生成目标并布置依赖。...外部CMakeLists.txt文件将尝试找到我们的上游依赖,并包含根据是否找到依赖来切换导入目标或构建它们的逻辑。

18300

面向 C++ 的现代 CMake 教程(二)

这也是一个针对每个目标的属性有一个默认变量,CMAKE_CXX_EXTENSIONS。...当你为一个单一目标指定同样的要求时,你设置属性依赖。因此,名称的最后部分也许应该简单地称为“属性”。 最后一个是–传递的。我相信这是正确的(也许有点太聪明了)。...CMake 将在使用它们的目标的某些属性/要求附加到使用它们的目标的属性上。你可以说是有些属性可以隐式地传递(或简单地传播)跨目标,所以更容易表达依赖关系。...介绍伪目标 目标的概念如此有用,以至于如果能够将其一些行为借鉴到其他事物上也很好。具体来说,这些事物不是构建系统的输出,而是输入——外部依赖、别名等等。...以下表达式如果满足特定条件将返回第一个参数,否则返回空字符串: $ – 在target_link_libraries()中隐式设置以存储PRIVATE deps链接依赖

25100
您找到你想要的搜索结果了吗?
是的
没有找到

小白入门笔记:CMake编译过程详解

但正如上文所说CMake是一个工具集,那就说明了CMake 自己并没有构建任何东西的能力,CMake依赖于系统中的其他工具来执行实际的编译、链接和其他任务。...IN ZIP_LISTS ) 在压缩列表中CMake 将为每个提供的列表创建一个num_ 变量,用每个列表中的填充该变量。...CMake为调整或扩展编译器标志提供了很大的灵活性,可以选择下面两种方法: • CMake将编译选项视为目标属性。因此,可以根据每个目标设置编译选项,而不需要覆盖CMake默认值。...示例中将应用这样的循环,在引入新目标的前提下,来为一组源文件进行优化降级: 最后,在回顾第二章中的循环语句的使用方式,以foreach()为例,有四种使用方式: 1. foreach(loop_var...:其中提供循环变量和显式列表,以上例中的列表变量为例,当为sources_with_lower_optimization中的打印编译器标志集时,使用此表单。

4.5K31

CMake 秘籍(三)

或者,我们可以在编译时获取并构建 Boost 依赖(请参阅第八章,超级构建模式,第二部分,使用超级构建管理依赖:I. Boost 库)。然而,Boost 不是一个轻量级依赖。...正如我们在本食谱中所展示的,自定义目标可以被指定为项目中其他目标的依赖。此外,自定义目标也可以依赖于其他目标,从而提供了在我们的构建中设置执行顺序的可能性。...在我们的例子中,压缩的 tar 存档是一个依赖。COMMENT字段将由 CMake 用于在构建时打印状态消息。...使用target_include_directories指定包含目录,并将wrap_BLAS_LAPACK声明为INTERFACE,因为只有math目标的依赖才需要它。...我们将通过一个示例来演示这一点,在该示例中,我们在目标构建之前打印链接行,然后在编译后的可执行文件之后测量静态大小分配。

44020

面向 C++ 的现代 CMake 教程(三)

CMake 检查目标的POSITION_INDEPENDENT_CODE属性,并适当地添加编译器特定的编译标志,如gcc或clang的-fPIC。 PIC 这个词有点让人困惑。...一个彻底的测试管道应该构建源代码,在生成的二进制文件上运行测试,然后才打包和分发可执行文件(不包括测试本身)。 但我们实际上是如何实现这一点的呢?...这是一种相当方便的方法,可以引入尚不支持 CMake依赖。...接下来,我们将IMPORTED_LOCATION和INTERFACE_INCLUDE_DIRECTORIES``IMPORTED目标的必需属性设置为函数被调用时传递的参数。...,或为非 CMake 依赖手动指定命令 build – 为 CMake 项目执行构建阶段,对于其他依赖,执行 make 命令 install – 安装 CMake 项目,对于其他依赖,执行

22800

面向 C++ 的现代 CMake 教程(四)

clang-tidy-3.9;-checks=*) 在此声明之后定义的任何目标,CXX_CLANG_TIDY属性将以此方式设置。...提供的检查包括性能改进、可读性、现代化、cpp-core-guidelines 和易出错命名空间等方面的改进。...总结:为用户生成文档或处理需要时的依赖添加。这在本章第七章,使用 CMake 管理依赖中有所涵盖,所以我们在这里不会重复这些步骤。...一切(包括库头文件)都被复制到一个共享位置,如 Linux 上的/usr/lib/calc/。由于这个片段中定义的目标的包含目录路径仍然指向源树,所以我们不能在另一个项目中使用这个目标。...包的所有必需的子依赖也必须在包配置文件中找到。

27700

面向 C++ 的现代 CMake 教程(五)

第七章,使用 CMake 管理依赖关系: 为了使项目更有趣,我们将引入一个外部依赖:一个文本 UI 库。我们在这一章描述了几种依赖管理方法。...构建和管理依赖 所有的构建过程都是相同的。我们从顶层列表文件开始,向下导航到项目源树。图 12.4 显示了哪些项目文件参与构建。...再次,我们将推迟讨论测试和文档,而是查看依赖管理和构建信息生成。 请注意,我们倾向于使用实用模块而不是 find-module 来引入 FTXUI。这是因为这个依赖不太可能已经存在于系统中。...管理依赖》中有详细描述。...为指定文件获取运行时依赖。这是一个仅在 install(CODE) 或 install(SCRIPT) 场景中使用的高级命令。

7100

【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

CMake 简介 : ① 构建工具 : CMake 是 Android 中使用 C/C++ 构建原生库的默认工具 ; ② 跨平台 : CMake 是跨平台的构建工具 , 可以根据不同类型的平台 , 不同类型的编译器...CMake 构建脚本 CMakeList.txt 设置静态库路径 : # 设置上述静态库的导入路径 # 设置目标属性参数 : # ① 参数 1 ( add ) : 要设置哪个函数库的属性...CMake 构建脚本 CMakeList.txt 链接静态库 : # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库...输出日志信息 ---- 调用 message() 方法可以输出日志信息 : # 打印日志信息 # ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构 #.../jniLibs/armeabi-v7a/libadd.a) # 打印日志信息 # ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构 # 当本次编译

2.5K40

CMake 秘籍(四)

我们在这里介绍的方法无法生成自动依赖,该依赖会在构建时重新生成print_info.c。换句话说,如果在配置步骤后删除了生成的print_info.c,该文件将不会被重新生成,构建步骤将会失败。...) 最后,我们定义了可执行文件及其目标,包括目录和依赖: add_executable(example "") target_sources(example PRIVATE example.cpp...头文件将作为example的依赖生成,并且每当generate.py脚本更改时都会重新构建。如果代码生成脚本生成多个源文件,重要的是所有生成的文件都被列为某个目标的依赖。...还有更多内容 我们提到所有生成的文件都应该被列为某个目标的依赖。然而,我们可能会遇到这样的情况:我们不知道这些文件的列表,因为它是根据我们提供给配置的输入由生成文件的脚本决定的。...ON) 此命令将当前目录添加到此CMakeLists.txt文件中定义的所有目标的INTERFACE_INCLUDE_DIRECTORIES属性中。

17820

《世嘉新人培训教材—游戏开发》2DGraphics1cmake构建

可以点击 链接器 -> 输入 ,看到附加依赖中有 GameLib_d.lib;%(AdditionalDependencies) 如何才能生成这个 GameLib_d.lib呢?...打开 src\GameLibs\2DGraphics1\GameLib.sln 编译即可 但是,通过右键Framework属性, 查看库管理器 的附加依赖可以看到 Modules_d.lib 这就要求必须先编译好...使用cmake搭建2DGraphics1 在经过前戏后,我们终于编译出了2DGraphics1所需要的GameLib_d.lib静态库以及相关的头文件,并且,我们还构建了2DGraphics1样例解决方案中的...最初版本和GB 2312一模一样,但在推出Windows 95时扩展成GBK)。 在CMake中想要给msvc指定文件编码方式,需要在CMakeLists.txt配置如下内容: ... ......观察vs中的项目属性—连接器—系统,会发现子系统(SubSystem)的值是:/SUBSYSTEM:WINDOWS 在cmake项目中,我们可以按照如下的方式进行配置: # 设置MT/MTd SET_PROPERTY

40140

推荐一款嵌入式Linux开源框架与封装-cpp-tbox

2) 根据日志等级渲染不同颜色,一了然,内容详尽 日志内容包含了:等级、时间(精确到微秒)、线程号、模块名、函数名、正文、文件名、行号。 方便快速定位问题。...灵活的参数系统,以不变应万变 参数以JSON的格式提供,可以传入任何格式的运行参数,包括:整数、小数、字串、数组、组合参数,满足几乎所有参数传入需求: 参数help 在执行时可以使用 -c your_cfg_file.json...有全面的异常捕获机制 当程序出现各种程序异常,如:段错误、断言、总线错误、异常未捕获等,架框会捕获并在日志系统中打印完整的调用栈。面对程序崩溃,不再一脸茫然。效果如下: 异常栈打印 9....方法二:CMake cmake -B build cmake --build build cmake --install build 通过指定CMAKE_INSTALL_PREFIX 自定义安装目录(默认安装在...打开 config.mk 文件,将不需要模块对应 app_y += xxx 屏蔽即可,但要注意模块间的依赖性。 许可 MIT[7],可免费商用。

28210

腾讯云 CMQ 消息队列在 Windows 环境下的使用

生成库文件 1.建空项目 使用 VS 平台新建项目(建议选择空的项目),用于生成 CMQ C++ SDK 静态库和动态库文 件: 建好项目后,导入附件 src 目录下所有源文件和头文件(包括 json...之后项目名上右击→属性→配置属性→常规: 生成静态库,选择配置类型为(.lib)。...操作:库管理器→常规→附加依赖→libcurl_imp.lib(这个是我自己生成的 curl 库文件,相同环境下可以直接拿去用)→确定。...5.生成动态库(dll) 更改项目配置类型: 之后的操作流程跟静态库的流程基本相同,注意检查下所有的附加和附加依赖是否添加完整!这里务必检查下,因为更改配置类型后,部分需要重新添加。...Dll 配置类型下附加库目录和附加依赖分属不同的编辑页面: 至此,所有配置修改完成后,直接项目名→右击→生成(重新生成的话会把之前的 lib 库删掉)。 三.

4.8K10

【Android NDK 开发】CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )

# 设置引入的函数库类型为静态库 STATIC # 表示引入第三方静态库 IMPORTED) # 设置上述静态库的导入路径 # 设置目标属性参数...: # ① 参数 1 ( add ) : 要设置哪个函数库的属性 # ② 参数 2 ( PROPERTIES ) : 设置目标属性 # ③...设置导入路径 # ④ 参数 4 : 配置静态库的文件路径 set_target_properties( # 设置目标 add # 设置属性.../jniLibs/armeabi-v7a/libadd.a) # 打印日志信息 # ${ANDROID_ABI} 的作用是获取当前的 CPU 指令集架构 # 当本次编译.../jniLibs/armeabi-v7a") # 链接函数库 # 参数 1 : 本构建脚本要生成的动态库 标 # 参数 2 ~ ... : 后面是之前预编译的动态库或静态库

1K10

【gtest】 C++ 的测试框架之使用 gtest 编写单元测试

ON) # 包含 FetchContent 模块,用于从外部资源获取依赖 include(FetchContent) FetchContent_Declare( googletest URL...include(FetchContent):包含了 CMake 的 FetchContent 模块,用于从外部资源(如 GitHub)获取依赖。...创建并运行二进制文件 将 gtest 声明为一个依赖后,你就可以在自己的项目中使用 GoogleTest 代码。...你可以通过对行为进行断言来测试一个类或函数。当一个断言失败时,gtest 会打印断言的源文件和行号位置,以及一个失败消息。你还可以提供一个自定义的失败消息,它将附加到 gtest 的消息中。...两个名称都必须是有效的 C++ 标识符,并且不能包含下划线【测试的全名=其所属的测试套件+单独的名称组成。

37810
领券