CMake 学习笔记(子目录 续)

2023-10-29

这篇博客接着上篇。我们的目录结构和上一个例子完全相同。

CMakeLists.txt
MathFunctions
  |- CMakeLists.txt
  |- MathFunctions.cxx
  |- MathFunctions.h
  |- mysqrt.cxx
  |- mysqrt.h

tutorial.cxx
TutorialConfig.h.in

在上一个例子中,为了包含 MathFunctions 库。我们在最上一层的 CMakeLists.txt 文件中加入了如下几行:

add_subdirectory(MathFunctions)
target_link_libraries(Tutorial PUBLIC MathFunctions)
target_include_directories(Tutorial PUBLIC
                          "${PROJECT_BINARY_DIR}"
                          "${PROJECT_SOURCE_DIR}/MathFunctions"
                          )

我们希望把这里尽可能的简化。其中 target_include_directories() 是可以省略掉的。其实也不是省略掉,而是可以挪到子目录下的 CMakeLists.txt 中。

我们先看一下改进后的 MathFunctions 目录下的 CMakeList.txt。

add_library(MathFunctions MathFunctions.cxx)
target_include_directories(MathFunctions
                           INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                           )

这里说一下, CMAKE_CURRENT_SOURCE_DIR 表示当前的源代码目录。

这样上层的 CMakeLists.txt 就只需要如下:

cmake_minimum_required(VERSION 3.10)

# set the project name and version
project(Tutorial VERSION 1.0)

# add the MathFunctions library
add_subdirectory(MathFunctions)

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

# configure a header file to pass some of the CMake settings
# to the source code
configure_file(TutorialConfig.h.in TutorialConfig.h)


# add the executable
add_executable(Tutorial tutorial.cxx)

# TODO 5: Link Tutorial to tutorial_compiler_flags

target_link_libraries(Tutorial PUBLIC MathFunctions)

# TODO 3: Remove use of EXTRA_INCLUDES

# add the binary tree to the search path for include files
# so that we will find TutorialConfig.h
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

上面代码有点长,其实为了引入 MathFunctions 只有

add_subdirectory(MathFunctions)
target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

上面的代码里出现了 tutorial_compiler_flags, 这里也要解释几句。tutorial_compiler_flags 是什么呢?是个虚拟的库。

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

这两行的作用是代替下面的两行:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

之所以要代替这两行,是因为这两行是全局的。对编译的每个文件都起作用。而 tutorial_compiler_flags 是局部的,只有

target_link_libraries(Tutorial PUBLIC MathFunctions tutorial_compiler_flags)

只有在编译 Tutorial 时会启用 cxx_std_11 这个 编译选项。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake 学习笔记(子目录 续) 的相关文章

  • CMake 未添加 ASM_MASM 的预处理器定义

    在使用以下 cmake 生成的构建系统 Visual Studio 2017 Generator 中 test asm 源文件不是使用预处理器定义 MY MASM DEFINITION 进行编译的 cmake minimum require
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • CMake 链接失败

    我正在为 CMake 配置我的项目 并且遇到链接问题 项目文件全部编译成功 然后它说它正在链接并报告未找到的各种符号 这些符号大部分是由我自己的代码提供的 其中一些是由 BerkeleyDB 提供的 它已被正确定位并包含在内 这是我的顶级
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • cmake 在执行其他操作之前执行进程

    我在执行其他操作之前 CMake 执行进程时遇到问题 下面的代码片段显示了这种情况 if NOT EXISTS CMAKE CURRENT BINARY DIR generated file MAKE DIRECTORY CMAKE CUR
  • 如何安装和使用 YAML-Cpp

    我想学习 YAML 并将其与 C 一起使用 但我一直在尝试设置YAML Cpp 让我解释一下到目前为止我所做的事情 我下载了源代码 版本0 5 1 安装的 Cmake 适用于 Windows 安装了 Boost 库 为 Visual Stu
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • CXX 编译器标识未知

    我们在使用 Visual Studio 2012 在 Windows 7 64 位下使用 CMake v2 8 12 编译项目时遇到问题 CMake 给我们提供了以下错误 我们已经尝试使用管理员权限从 Visual Studio 命令行启动
  • 来自库的 CMake link_directories

    我正在尝试使用 CMake 和 Xcode 从另一个库链接到一个库 这对任何图书馆来说都是一个问题 但为了让事情更容易传达 让我们使用zlib举个例子 这似乎适用于可执行文件 如下所示 LINK DIRECTORIES LIB DIR zl
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c
  • doxygen INSTALL 无法将文件“.../doxygen/build/bin/doxygen”复制到“/usr/local/bin/doxygen”

    解决了一些之后最初的问题 https stackoverflow com q 50986047 4120196在尝试让 doxygen 工作时 我在遵循以下步骤时偶然发现了下一个错误doxygen安装教程 http www doxygen
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • (如何)我可以抑制未找到包配置文件的警告吗?

    我正在尝试创建一个CMakeLists txt尝试查找的文件Qt5 如果失败 则尝试回退到Qt4安装 该脚本到目前为止有效 但如果出现以下情况我总会收到警告Qt5未安装 注意FindQt5 cmake是由提供Qt5并且仅当以下情况时才可用Q
  • cmake 生成 Xcode 项目 - 发布构建有效,但存档因链接器错误而失败

    使用 Xcode 6 3 1 CMake 3 2 2 我有一个与图书馆链接的项目 该库作为代码包含在 xcode project 中 经过编译 然后与主可执行文件链接 项目是用cmake生成的 CMakeLists txt 的一些摘录 ad
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除
  • MinGW Make 抛出“系统找不到指定的路径。”错误

    我正在尝试在 Windows 7 上使用 cmake 生成一个 c 项目 在实际创建项目之前 cmake 会对您的工具链进行快速测试 我正在使用 MinGW 这就是我的问题所在 Cmake 触发 make 构建 最终失败并返回 系统找不到指
  • 是否可以使用 gold 链接器编译和链接 Clang/LLVM?

    我正在为 LLVM Clang 编写自定义通道 重新编译往往需要一段时间并使用大量内存 我听说 gold 链接器 1 比标准 ld 链接器花费更少的时间并且 2 使用更少的内存 有没有办法将标志传递到 LLVM Clang 构建过程并更改为
  • 具有许多第三方依赖项的大型跨平台 C++ 项目在磁盘上的物理布局

    我正在重新组织物理 磁盘上 布局大型跨平台 C 项目 https github com jupiter jazz appleseed具有许多第三方依赖项 使用 CMake 构建 由于我们需要支持 Windows 这个平台上没有完善的包管理器

随机推荐

  • 2021年CCPC河南省赛部分题解

    文章目录 2825 收集金币 状态机dp 2826 使用技能 乘法逆元 组合数学 2827 欢度佳节 位运算 枚举 2829 闯关游戏 DP 2834 小凯的书架 树状数组 二分 2835 未成年人之友 模拟 2836 黑曜石 思维 282
  • vs工程 vcproj和开发环境定义宏---$(IntDir)和$(OutDir)

    一 vs 基础配置文件解析 vcproj是工程文件 sln是解决方案文件 一个解决方案里面可以包含多个工程 你打开vcproj文件编译不了可能是因为这个工程里面用到了同一个解决方案中其它工程的东西 visual Studio NET采用两种
  • 解决network-manager中wired为unmanaged的问题

    我的Debian 7 1安装好时没有network manager 便下载安装了一个 但安装完后wired总显示为unmanaged 解决方法如下 打开 etc NetworkManager NetworkManager conf 将man
  • Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处 http blog csdn net lmj623565791 article details 38067475 1 概述 Android提供了几种动画类型 View Animation Drawable Animation
  • matlab 转换为正整数_【MATLAB】专题1笔记 MATLAB基础知识

    视频课程参考 https www bilibili com video BV19J411W7Ta 数值问题 gt 求解算法 gt 程序实现 gt 结果分析 MATLAB 功能 数值计算 符号计算 图形绘制 程序流程绘制 工具箱 数值计算方法
  • 什么是哈希函数

    Hash函数译为哈希函数 又称散列函数 是把任意长度的输入 通过散列算法 变换成固定长度的输出 该输出的值称为散列值或消息摘要 简单来说就是一种将任意长度的输入消息压缩成某一固定长度的消息摘要的函数 它具备以下的性质 哈希函数所必须的性质
  • 《数据结构》_PTA_数据结构作业5:树和二叉树

    判断题 1 1 某二叉树的前序和中序遍历序列正好一样 则该二叉树中的任何结点一定都无右孩子 F 1 2 存在一棵总共有2016个结点的二叉树 其中有16个结点只有一个孩子 F 1 3 哈夫曼树中一定没有度为 1 的结点 T 1 4 一棵非空
  • jdk1.8接口

    在1 8版本之前 接口中的常量必须复制 且接口中的方法都是抽象方法 public interface Bird int a 这里会报错 因为常量必须赋值才行 int b 10 void shout1 这里报错 因为抽象方法没有方法体 voi
  • KMP算法最浅显理解

    角色 甲 abbaabbaaba 乙 abbaaba 乙对甲说 帮忙找一下我在你的哪个位置 甲从头开始与乙一一比较 发现第 7 个字符不匹配 要是在往常 甲会回退到自己的第 2 个字符 乙则回退到自己的开头 然后两人开始重新比较 这样的事情
  • 加密世界的价值捕获:谁是超级捕获者?

    来源 蓝狐笔记 麦田的收获者 梵高 加密世界还很早期 整个行业都还处于构建的初级阶段 在这种情况下 有哪些赛道正在捕获价值 捕获价值的量级有多大 蓝狐笔记简要梳理一下加密行业的整体价值捕获情况 从中窥见加密行业不同赛道的价值捕获现状 尤其是
  • Gradle史上最详细解析

    转自 http www cnblogs com wxishang1991 p 5532006 html 前言 对于Android工程师来说编译 打包等问题立即就成痛点了 一个APP有多个版本 Release版 Debug版 Test版 甚至
  • 计算机提示xinput1_4.dll丢失的解决方法,哪种更值得推荐

    最近我在使用某个游戏时遇到了一个问题 就是出现了xinput1 4 dll文件缺失的错误 这个错误让我无法正常启动游戏 让我感到非常困扰和沮丧 经过一番努力 我终于成功修复了这个问题 也总结了一些解决方法 大家可以对比一下哪种更值得推荐 x
  • react 属性验证与默认属性

    类组件属性验证与默认属性 通过static定义类的属性 属性验证可以引入模板自带的prop types来进行类型判断 当然你也可以自己写一个类型判断的方法 然后对类的propTypes属性进行类型编写 propTypes 这个属性名不可自定
  • 【AWS实验】 使用 Lake Formation 设置数据湖

    文章目录 实验概览 目标 实验环境 任务 1 探索实验环境 任务 1 1 在 S3 存储桶中创建文件夹 任务 1 2 加载 AWS Cloud9 IDE 任务 1 3 将数据复制到 S3 存储桶 任务 2 设置 AWS Lake Forma
  • jq的ajax里面的datagrid,详解jquery easyui之datagrid使用参考

    本文介绍了jquery easyui之datagrid使用 具体如下 创建datagrid 在页面上添加一个div或table标签 然后用jquery获取这个标签 并初始化一个datagrid 代码如下 页面上的div标签 js代码 mag
  • ES配置与使用

    一 单机版安装 地址 www elastic co 下载tar格式 或者复制链接 wget url下载 启动 bin elasticsearch 二 插件 解决页面问题 GitHub下载 elasticsearch head 需要node环
  • RISC-V新进展!deepin 成功适配VisionFive 2

    RISC V指令集是基于精简指令集计算 RISC 原理建立的开放指令集架构 ISA RISC V则是在指令集不断发展和成熟的基础上建立的全新指令 RISC V指令集完全开源 设计简单 拥有模块化的设计 完整的工具链 易于移植Unix系统 以
  • WebService+Rxjava

    最近公司有了个新项目 是之前有个项目需要迭代 由于这个项目比较老 所以用的是WebService的接口 我之前都是写的是restful的接口 没有接触过WebServiece 看到之前的代码我也有点闷逼 于是就花了几天去研究了下WebSer
  • 补码乘法,补码乘法计算详细解说

    1 补码与真值得转换公式 补码乘法因符号位参与运算 可以完成补码数的 直接 乘法 而不需要求补级 这种直接的方法排除了较慢的对2求补操作 因而大大加速了乘法过程 首先说明与直接的补码乘法相联系数学特征 对于计算补码数的数值来说 一种较好的表
  • CMake 学习笔记(子目录 续)

    这篇博客接着上篇 我们的目录结构和上一个例子完全相同 CMakeLists txt MathFunctions CMakeLists txt MathFunctions cxx MathFunctions h mysqrt cxx mysq