首页
学习
活动
专区
圈层
工具
发布

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 生成的图表将显示不同目录中目标之间的依赖关系: 在本书中,我们一直在进行源外构建,以保持源代码树和构建树分离。

1.1K20

CMake入门教程:让跨平台构建变得简单

target_include_directories - 指定目标的包含目录PUBLIC表示这些目录同时对库本身和使用该库的目标可见target_link_libraries - 将目标与库进行链接PRIVATE...例如,使用Boost库:```cmake查找Boost库find_package(Boost 1.65 REQUIRED COMPONENTS filesystem system)将Boost链接到我们的目标...首先,在顶层CMakeLists.txt中启用测试:```cmake启用测试enable_testing()```然后,添加测试:```cmake添加一个简单的测试add_test( NAME test_app...": "Debug" } } ] }模块化CMake文件 - 对于大型项目,将CMake逻辑分散到多个文件中 cmake add_subdirectory...=Debug ..问题:不兼容的库版本解决方案:在CMakeLists.txt中明确要求的版本cmakefind_package(Boost 1.70 REQUIRED)问题:不同编译器的警告处理解决方案

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

    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)# 将源代码添加到此项目的可执行文件。

    58110

    【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 构建脚本中常用的命令 :

    4.8K01

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

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

    1.1K00

    CMake 秘籍(六)

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

    1.4K00

    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 镜像既包含应用程序也包含内核库。

    2K21

    CMake 秘籍(二)

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

    2.2K20

    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 库的东西移到

    3K20

    CMake 秘籍(三)

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

    1.7K20

    如何对 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.6K50

    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...在您的例子中,您可能会观察到不同的结果,这取决于您的操作系统。

    1.1K00

    学C++从CMake学起

    make 的语法非常简单,不像 shell 或 python 可以做很多判断。 不同的编译器有不同的 flag 规则,为 g++ 准备的参数可能对 MSVC 不适用。...构建系统的构建系统 「CMake」 为了解决 make 的以上问题,跨平台的 CMake 应运而生! 只需要写一份 CMakeLists.txt,就能够在调用时生成当前系统所支持的构建系统。...CMake的命令行调用 读取当前目录的 CMakeLists.txt,并在 build 文件夹下生成 build/Makefile cmake -B build 让make读取build/Makefile...库中的函数可以被可执行文件调用,也可以被其他库文件调用。 库文件又分为静态库文件和动态库文件。 其中静态库相当于直接把代码插入到生成的可执行文件中,会导致体积变大,但是只需要一个文件即可运行。...CMake中的子模块 复杂的工程中,我们需要划分子模块,通常一个库一个目录。

    21110

    C++ 大型工程基础 - CMake教程(初级)

    在 C++ 开发中,跨平台一直是个挑战——不同操作系统或硬件环境往往需要使用不同的本地构建工具,例如 Linux 常用的 Makefile、高效的 Ninja、Windows 上的 Visual Studio...这样,软件就能在 Windows、Android、iOS、Linux 以及高性能计算集群等不同环境中顺利编译和运行。...CMake 允许使用外部源代码进行构建,并且允许每个源代码树拥有多个构建树。现代 CMake 允许将构建过程指定为一组目标(可执行文件、库、自定义命令)。每个目标都定义了它直接依赖的其他目标。...然后,CMake 会按照正确的顺序执行构建,并包含传递链接目标。每个 CMake 构建树都包含一个缓存文件,其中包含构建过程中设置的变量。...(如CMakeLists.txt)中的指令。

    41620

    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.4K20

    解决CMAKE_CURRENT_SOURCE_DIR

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

    1.3K30

    面向 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

    1.9K10

    CMake简易指南

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

    2.1K50
    领券