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

CMake 秘籍(四)

本食谱的目标与前一个相似,但起点不同;我们的计划是从文件中读取版本信息,而不是在CMakeLists.txt内部设置它。...项目通常从一个CMakeLists.txt文件开始,但随着时间的推移,这个文件会增长,在本例中,我们将演示一种将CMakeLists.txt拆分为较小单元的方法。...将CMakeLists.txt拆分为可以在主CMakeLists.txt或其他模块中包含的模块有几个动机: 主要的CMakeLists.txt更容易阅读。...在下一个食谱中,我们将展示一种替代方法,其中我们不使用add_subdirectory,而是使用模块包含来组装不同的CMakeLists.txt文件,这允许我们链接到当前目录之外定义的目标。.... $ dot -T png example.dot -o example.png 生成的图表将显示不同目录中目标之间的依赖关系: 在本书中,我们一直在进行源外构建,以保持源代码树和构建树分离。

25120

CMake 添加外部源文件

CMake 添加外部源文件项目文件树CPP11ThreadLearn ├── CMakeLists.txt------------顶级CMake文件 ├── CPP11ThreadLearn------....h .cpp不编译成静态库或动态库项目中 #include"tools.h" 即可以使用,像是在同一目录下的效果较好的维护性 不要在每个 CMakeLists.txt 中添加大量代码解决方案:思路:通过...CMake 配置文件加入头文件和源文件第一步:定义函数# 顶级CMake文件中添加函数# 添加外部源码库(单层文件结构)function(add_path_to_target target path)...${path}) target_sources(${target} PRIVATE ${var}) endfunction() 第二步:使用函数# 在项目 1 or 2 下的 CMakeLists.txt...中使用该函数# CPP11ThreadPool/CMakeLists.txt 内容cmake_minimum_required (VERSION 3.8)# 将源代码添加到此项目的可执行文件。

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

    CMake 秘籍(八)

    CMake 在本书的最后一章中,我们将结合前面章节中讨论的多个不同的构建块,并将其应用于一个实际项目。...我们的目标将是逐步展示如何将一个非平凡的项目移植到 CMake,并讨论这样的过程中的步骤。...在原始布局中,文件在 src 文件夹下生成。我们不喜欢这种方法,在我们的示例 CMake 移植中将采取不同的做法:这些文件将在构建目录中生成。...如何组织文件 我们将收集生成这些文件的函数在src/autogenerate.cmake中,包含此模块,并在定义可执行目标之前在src/CMakeLists.txt中调用这些函数: # generate...一种强制分离变量范围的方法是将大型项目划分为 CMake 项目,这些项目使用超级构建模式(参见第八章,超级构建模式)。考虑将大型CMakeLists.txt文件拆分为较小的模块。

    19810

    【CMake】CMake 引入 ( Android NDK 构建脚本 | CMake 命令手册 )

    : ${CMAKE_SOURCE_DIR}, ANDROID_ABI : ${ANDROID_ABI}") # 到预设的目录查找 log 库 , 将找到的路径赋值给 log-lib # 这个路径是...NDK 的 ndk-bundle\platforms\android-29\arch-arm\usr\lib\liblog.so # 不同的 Android 版本号 和 CPU 架构 需要到对应的目录中查找...| 引入静态库 | 指定静态库路径 | 链接动态库 ) 复制来的 ; 三、CMake 命令手册 ---- CMake 命令分为三种 , 脚本命令 , 工程命令 , CTest 命令 ; 1、CMake...try_compile try_run 在 Android Studio 中的 CMake 构建脚本 CMakeLists.txt 中使用到的所有 CMake 命令都来自上述脚本命令和工程命令 , 如...add_library , find_library , target_link_libraries 等 ; Android Studio 中的 CMakeLists.txt 构建脚本中常用的命令 :

    3.8K01

    关于CMake中不同变量的用法与总结

    CMake中的变量CMake中变量的类型有多种:通过set设置的普通变量和缓存变量、环境变量、数组变量等等,由于CMake在生成的过程中会加载缓存的关系,因此用法不一样。...variable)相当于编程中脚本内部变量,类似于脚本文件的局部变量,这种变量不能跨越CMakeLists.txt文档。...和编程语言中局部变量的用法类似,这个变量会屏蔽CMake缓存中的同名变量,(类似局部变量屏蔽全局变量)。但是这条语句不会改变缓存中的var变量。...缓存变量也可以设置只在本文件内生效,将STRING类型改为INTERNAL即可。...给定的值option实际上只是“初始值”(在第一个配置步骤中一次传送到缓存),之后将由用户通过CMake的GUI或者命令行进行更改总结正常使用的时候,如果有多层CMakeLists.txt,需要跨文本的变量

    39300

    CMake 秘籍(六)

    让我们首先看一下src子目录中的CMakeLists.txt文件,所有额外的工作实际上都在这里进行。我们将根据上一节中的文件来突出显示更改: 我们声明了我们的SHARED库目标及其消息库的源文件。...当然,不同的编译器将有不同的选项可用,直接在我们的CMakeLists.txt中手动设置这些将不是跨平台的。...这就是我们在熟悉的 CMake 项目使用方案中提到的打包时间,显示了项目的各个阶段: 在本章中,我们将探讨不同的打包策略。我们将首先讨论使用 CMake 家族中的工具 CPack 进行打包。...平台原生二进制安装程序:CPack 能够生成多种不同格式的二进制安装程序,因此您可以将软件分发目标定位到许多不同的平台。...二进制归档文件 在创建二进制归档文件时,CPack 将根据我们的CMakeCPack.cmake文件中描述的安装说明,将目标的内容打包。

    40800

    zephyr笔记 2.1 应用程序开发基础

    基础介绍 1.进入应用程序目录 /app. 2.输入如下命令,将会按照 应用程序的 CMakeLists.txt 文件的设置,编译出应用程序的 zephyr.elf 镜像。...-GNinja .. ninja 如果需要,可以为不同的硬件板子生成项目文件,通过定义环境变量 BOARD。...CMake 编译分为两步,第一步称作 配置,配置期间,CMakeLists.txt 编译脚本会执行。配置结束后,CMake 便有了内部模型,可以生成针对主机的编译脚本。...target_sources(app PRIVATE src/main.c) 在上面的 CMakeLists.txt 中,已存在的 library target 名为 app,为其配置包含源码文件 src...应用程序的 CMakeLists.txt 每个应用程序都必须包含 CMakeLists.txt,这个文件是编译系统的入口。最后的 zephyr.elf 镜像既包含应用程序也包含内核库。

    1.8K21

    CMake 秘籍(二)

    ;其他操作系统将产生不同的输出。...如果您使用的是不同的编译器供应商,那么此示例代码将提供不同的问候。 在前面的示例和之前的配方中的CMakeLists.txt文件中的if语句似乎是重复的,作为程序员,我们不喜欢重复自己。...它将仅使用 CMake,完全摆脱预处理器,代价是每个情况都有一个不同的源文件,然后使用target_sources CMake 命令将其设置为可执行目标arch-dependent的源文件: add_executable...C_DSCAL和C_DGESV是 BLAS 和 LAPACK 库的接口,分别负责名称修饰,以便从不同的编程语言调用这些函数。这是在以下接口文件中与我们将进一步讨论的 CMake 模块结合完成的。...CMakeLists.txt与之前配方中使用的不同之处在于使用了FindZeroMQ.cmake模块。

    62520

    CMake基础

    四、构建系统的构建系统CMake 为了解决 make 的以上问题,跨平台的 CMake 应运而生: 只需要写一份 CMakeLists.txt,他就能够在调用时生成当前系统所支持的构建系统 CMake...可以自动检测源文件和头文件之间的依赖关系,导出到 Makefile 里 CMake 具有相对高级的语法,内置的函数能够处理 configure,install 等常见需求 不同的编译器有不同的 flag...比如 OpenMP,只需要在 CMakeLists.txt 中指明 target_link_libraries(a.out OpenMP::OpenMP_CXX) 即可 五、CMake的使用 1.CMake...有时候我们会有多个可执行文件,他们之间用到的某些功能是相同的,我们想把这些共用的功能做成一个库,方便大家一起共享 库中的函数可以被可执行文件调用,也可以被其他库文件调用 库文件又分为静态库文件和动态库文件...PUBLIC 的含义稍后会说明(CMake 中有很多这样的大写修饰符) 4.CMake中的子模块 复杂的工程中,我们需要划分子模块,通常一个库一个目录,比如: 这里我们把 hellolib 库的东西移到

    1.9K20

    CMake 秘籍(三)

    在本章中,我们将演示如何将测试集成到 CMake 构建结构中,使用流行的测试库和框架,并牢记以下目标: 让用户、开发者和持续集成服务轻松运行测试套件。...在本食谱中,我们将演示如何使用 CMake 和 Google Test 框架实现单元测试。与之前的食谱不同,Google Test 框架不仅仅是一个头文件;它是一个包含多个需要构建和链接的文件的库。...使用 CMake,我们不仅能够在不同的平台上生成构建系统,还能够执行这些操作,而不需要复杂的逻辑来抽象不同的操作系统。本节将展示如何以可移植的方式提取先前下载的存档。...这样,自定义目标可以在与其依赖项不同的目录中指定,这在为项目设计模块化 CMake 基础设施时非常有用。 准备工作 对于这个配方,我们将重用前一个配方的源代码示例。然而,我们将稍微修改源文件的布局。...因此,可以在子目录中引入自定义目标,并且仍然能够在顶层的CMakeLists.txt中引用它。

    60320

    如何对 Neuron 源码进行交叉编译

    开源社区用户有时会有使用 Neuron 源码在当前编译平台下编译能够运行在体系结构不同的另一种目标平台上,即进行交叉编译的需求。在这一过程中可能会遇到由于没有安装好依赖库等原因导致的编译错误。...cd neuron$ git submodule update --init$ mkdir build && cd build什么是交叉编译交叉编译,可以理解为在当前编译平台下,编译出能够运行在体系结构不同的另一种目标平台上的可执行程序的过程...交叉编译链的重点在于交叉编译器,使用不同平台的编译器用来生成可在该平台运行的可执行程序。所有语句都写在跨平台编译工具 CMake 所依赖的规则文件 CMakeLists.txt 中,用于构建整个工程。...target_sources(neuron PRIVATE ${NEURON_SOURCES}) # 将头文件库路径添加到 neuron 中target_include_directories(neuron...用户可以根据本文,自行编译出所需架构的可执行文件,从而更好地将 Neuron 运行在不同架构平台上,实现相应的业务目标。

    1.2K50

    CMake 秘籍(七)

    这添加了一个新的docs目标,该目标将调用 Doxygen 来构建我们的文档: add_doxygen_doc( BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/...它是如何工作的 由于我们在与目标环境(Windows)不同的宿主环境(在这种情况下,GNU/Linux 或 macOS)上配置和构建代码,我们需要向 CMake 提供有关目标环境的信息,我们已经在toolchain.cmake...└── test_short.cpp 如何做到这一点 现在,我们将描述如何配置、构建、测试,最后,将我们示例项目的测试结果提交到仪表板: 源目标在src/CMakeLists.txt中定义,如下所示:...让我们看看如何做到这一点: 有问题的库在src/CMakeLists.txt中定义: add_library(buggy "") target_sources(buggy PRIVATE...在您的例子中,您可能会观察到不同的结果,这取决于您的操作系统。

    20300

    xmake vs cmake对比分析

    当初我做xmake的目的,也并不是为了完全替代cmake,这没啥意义,只是觉得cmake的语法和易用性满足不了我,我还是更喜欢更简单直观的方式去描述和维护项目,在不同平台下提供近乎一致的使用体验。...()是非常灵活强大的,不仅可以支持各种不同类型源文件添加,还可以在添加的同时排除一些指定文件。...cmake . cmake --build . 编译指定平台 xmake xmake可以以近乎一致的方式快速切换不同平台和架构来编译。...install cmake cmake -P cmake_install.cmake 运行目标 xmake 大部分情况下,xmake不需要写自定义脚本就可以直接加载运行编译生成的目标程序。...xmake run cmake cmake我没找到可以快速运行指定目标程序的方式,但是应该可以通过写一个自定义脚本去加载运行它。

    2.1K20

    解决CMAKE_CURRENT_SOURCE_DIR

    本文将介绍一种解决 ​​CMAKE_CURRENT_SOURCE_DIR​​ 变量无法正确解析的方法。...跨平台支持:CMake可以生成适用于多种操作系统和编译器的构建脚本。这意味着你可以使用相同的CMake配置文件在不同的平台上构建你的项目。...你可以将项目划分为多个模块,并为每个模块编写单独的CMakeLists.txt文件,再通过顶层CMakeLists.txt文件来组合它们。...编写CMakeLists.txt文件:在CMakeLists.txt文件中,使用CMake提供的语法和命令来描述项目的构建过程,例如定义变量、设置编译选项、添加源文件、链接库等。...以上只是一些常用的命令,CMake提供了很多其他的命令和特性,用于处理更复杂的构建需求。CMake是一个强大而灵活的构建工具,适用于各种规模的项目和不同的平台。

    47330

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

    图 3.4 – CMake 如何将列表文件合并到一个项目中 在图 3.4中,每个框代表了一个位于特定目录中的CMakeLists.txt文件列表,而草体字中的标签代表了每个文件执行的动作(从上到下)。...这些机制允许我们避免使用可能不易移植或在不同环境中命名不同的平台特定 shell 命令。 对于性能关键的应用程序,了解目标平台的所有特性(例如,指令集、CPU 核心数等)将很有用。...在 C++中,不同的架构意味着一些基本数据类型(int和long)和指针有不同的位宽。CMake 利用指针大小来收集目标机器的信息。...它是一个生成表达式,评估目标二进制文件的完整路径。这种机制在许多目标属性上下文中很有用。 理解生成表达式 CMake 解决方案的构建分为三个阶段——配置、生成和运行构建工具。...我们可以使用target_sources()命令将文件追加到先前创建的目标: chapter05/01-sources/CMakeLists.txt add_executable(main main.cpp

    70600

    CMake简易指南

    的运行大致分两到三步,下述样例属于cmake 控制台命令:配置:输入源文件目录,指定目标编译系统,添加编译选项,生成目标编译系统编译:输入目标编译系统,执行编译安装(可选):将编译产物安装到指定位置(...CMakeLists.txt开始加载,遇到第一个project(xxx)时开始检查编译环境中的编译器,执行完所有代码后将全局变量保存至CMakeCache.txt文件,再次执行配置时不会再修改全局变量,...中的target产物也在该缓存文件夹平台差分跨平台项目中通常会遇到不同平台参与编译的头文件不一样,或者编译选项不同,在 cmake 里有一些描述平台的系统变量:CMAKE_SYSTEM_NAME:描述目标平台名称...与 CMAKE_HOST_SYSTEM_NAME 是不同的,正因为编译环境与运行环境不同,所以才叫 交叉编译变量以及内置变量为了便于阅读和维护,通常会使用变量来保存一些内容,cmake 中变量分为常规变量...POST_BUILD:链接成目标文件之后生成器表达式在 cmake 中,除了常规的命令行,如if(xxx),还支持一种特殊语法 生成器表达式,生成器表达式与常规命令不同,常规命令在 配置 阶段生效,而生成器表达式在

    87150

    CMake学习笔记(三)——以笔者的Robosub竞赛为例

    注: 关于语法的总结,笔者前面的文章《CMake学习笔记(二)——CMake语法》中,也对CMake语法做了较为系统的总结。 3....此处两行SET代码是指将这两个路径设置为PROJECT_BINARY_DIR(即执行cmake指令的路径)下的bin, lib路径中。...后面的紧接的四个ADD_SUBDIRECTORY指令,是指CMake指令顺序进入四个路径中,顺序执行几个路径中的CMakeLists.txt文件。 这里笔者认为可以将其理解成C++的四个函数。...(${PROJECT_BINARY_DIR}/lib)就是将库文件路径包含在工程中,以便后面库文件的链接。...服务器类只有一个,但依照完成不同功能的模块,被笔者分为五部分: ncserver_link:服务器端socket网络通信部分的类函数源码 ncserver_dataproc:服务器端解算获得数据部分的类函数源码

    1.3K100

    【C++】基础:代码编译与构建工具介绍

    知识介绍 C++ 编译与构建工具主要用于将 C++ 源代码转换为可执行程序。它们可以分为以下几类: 1.编译器: 将 C++ 源代码转换为机器代码。...Visual Studio:微软开发的编译器,支持 Windows 平台。 2.链接器: 将编译后的目标文件链接在一起,形成可执行程序。...如果要自己编译很多源文件的时候就需要cmake工具,可以更加方便地生成makefile文件给make用。cmake还可以跨平台生成对应平台可用的makefile,无需自己根据每个平台的不同特性修改。...同样在开源工程中很常见,对源码的编译通常是: mkdir build && cd build cmake .. make make install CMake通过CMakeLists.txt文件来描述项目的构建过程...CMake可以生成Makefile或Visual Studio项目文件等,使开发人员可以在不同的平台和编译器上使用相同的配置文件进行构建。

    27210
    领券