CMake - 如何使库的私有标头可供其测试使用?

2023-11-23

因此,我正在将项目的一部分制作为一个库,其中一些标头是该库的接口,其余部分是库本身私有的。因此,对于我的库,CMAKE 部分如下所示:

add_library(${PROJECT_NAME} ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h")
add_library(my::lib ALIAS ${PROJECT_NAME})

target_include_directories(${PROJECT_NAME} 
    PRIVATE ${Boost_INCLUDE_DIRS}
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h
    INTERFACE ${PUBLIC_INCLUDE_HEADERS}
    )

然后是我的测试目标:

add_executable(${TEST_NAME} ${TEST_SOURCES})
add_test(NAME LibTest COMMAND ${TEST_NAME})

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES}
    PRIVATE my::lib
    )

但这只允许我测试我的公共接口。如果我想对我的库进行单元测试,我将如何声明对项目中其余标头的访问权限lib?我的看法是添加一个全新的目标my::lib::testing它将接口声明为当前源目录(当前所有标头都位于其中,将公共标头与专用标头分开是我尚未处理的另一个问题)。所以像这样:

add_library(${PROJECT_NAME}_TESTING ${PROJECT_SOURCES} "${PROJECT_BINARY_DIR}/libversion.h")
add_library(my::lib::testing ALIAS ${PROJECT_NAME}_TESTING)

target_include_directories(${PROJECT_NAME}_TESTING
    PRIVATE ${Boost_INCLUDE_DIRS}
    PRIVATE ${PROJECT_BINARY_DIR} #to locate libversion.h
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
    )

但这需要根据用途构建两个不同的目标。一个用于我的应用程序链接到别名my::lib一个用于单元测试,链接别名my::lib::testing.

所以我的问题是,我该如何cleanly单独的标题,这样我就只能有我的INTERFACE目标显示的标头,但仍然可以通过我的测试目标访问剩余的标头?


PRIVATE 和 PUBLIC 项都会填充目标的 INCLUDE_DIRECTORIES 属性,因此您可以尝试在测试项目的 target_include_directories 中使用它。

add_executable(${TEST_NAME} ${TEST_SOURCES})
add_test(NAME LibTest COMMAND ${TEST_NAME})

target_link_libraries(${TEST_NAME} 
    PRIVATE ${Boost_LIBRARIES}
    PRIVATE my::lib
    )

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

CMake - 如何使库的私有标头可供其测试使用? 的相关文章

  • 数据结构的优化存储以实现快速查找和持久化

    Scenario 我有以下方法 public void AddItemSecurity int itemId int userIds public int GetValidItemIds int userId 最初我正在考虑表单上的存储 i
  • 是否可以通过引用以基类作为参数的函数来传递派生类

    假设我们有一个抽象基类IBase使用纯虚方法 接口 然后我们推导出CFoo CFoo2来自基类 我们有一个知道如何使用 IBase 的函数 Foo IBase input 这些情况下通常的场景是这样的 IBase ptr static ca
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 二维数组的列求和

    我有一个IEnumerable
  • Cmake 错误:无效的转义序列 \U

    使用 CMake 在 VC 10 中运行 OpenCL 代码时 出现以下错误 CMake Error at CMakeLists txt 6 set Syntax error in cmake code at C Users Shreedh
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • Ajax 函数在重定向后不保存滚动位置

    正如标题所述 我编写了一个 ajax 函数 该函数应该滚动到用户在重定向之前所在的位置 我写了一个alert对于测试场景 它确实触发了 但滚动不断回到顶部 我在这里做错了什么 JavaScript ajax type GET url Adm
  • 不可能的事情发生了!这是什么意思?

    我遇到了一个有趣的运行时错误 我认为这是某种内存泄漏 我写了以下程序 C Code include
  • 为什么 C++20 范围不只提供管道语法?

    我知道这个问题听起来很奇怪 所以这里有一些背景信息 最近 我很失望地了解到 C 20 范围内的映射缩减并不像人们所期望的那样工作 即 const double val data transform accumulate 不起作用 你必须这样
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • 如何明智地解释这个编译器警告?

    当我执行这段代码时question https stackoverflow com a 51056490 2411320 我收到这个警告 warning format d expects argument of type int but a
  • 更改成员资格、角色等的默认连接字符串

    默认情况下 我的网络应用程序似乎正在使用LocalSqlServer作为用于任何应用程序服务 例如成员资格 角色 身份验证 等 的连接字符串 有什么方法可以更改默认连接字符串应该是什么 默认值是 LocalSqlServer 似乎很随意 我
  • std::iota 的 iota 代表什么?

    我假设 i 是增量 a 是分配 但我无法弄清楚或找到答案 而且 它看起来与非标准非常相似itoa我认为这很令人困惑 C iota is not an acronym or an initialism It is the word iota
  • 如何在您的网站中连接两个人

    有一款名为 Verbosity 的游戏 这是一款有目的的游戏 位于此链接上www gwap com 在游戏中 他们随机连接两个玩家互相玩 游戏是玩家1应该向他的搭档 玩家2 描述一个单词 而玩家2应该猜测这个单词 我正在尝试建立一个网站来执
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • NuGet 包引用复制 dll 本地

    我需要将 NuGet dll 的 Copy Local 设置为 false 在此之前 我使用了包配置格式 一切正常 迁移到后封装参考格式 我找不到如何做到这一点的方法 有人可以帮助我吗 您可以使用私有资产 从文档复制
  • 使用 Hibernate API 进行 Java 字符串日期验证

    我正在尝试验证字符串日期 using javax validation 休眠验证 我需要检查给定的字符串日期应该是过去的并且它应该是正确的yyyyMMdd具有所有限制的格式 例如闰年 30th 31st day public class U
  • 如何捕获鼠标移动事件

    我想在我的主窗体中捕获鼠标移动事件 虽然我能够连接MouseEventHandler对于主窗体 当光标位于 UserControl 或任何其他控件上时 该事件不再触发 如何确保我始终掌握鼠标位置 您可以使用低级鼠标钩 看this示例并检查
  • 使用 ctypes 传递数组

    我有一个C函数 void read FIFO AI0 int16 t input size t size NiFpga Session session NiFpga Status status input int16 t malloc si
  • 如何使用 SWIG 扩展 python 中的模板化 C++ 类以允许 [] 运算符

    我有一个模板化的 C 数组类 它使用标准向量类 include
  • 向量点积计算的时间和空间复杂度

    计算两个长度为 n 的向量之间的点积的算法的时间和空间复杂度是多少 如果这 2 个向量是a a1 a2 an and b b1 b2 bn then 点积由下式给出a b a1 b1 a2 b2 an bn 为了计算这个 我们必须执行n乘法
  • 设置 tk.Frame 宽度和高度

    所以我正在创建一个 GUI 并尝试使其一切都适合屏幕 我已经画出了我希望 GUI 的每个部分的外观及其大小的粗略草图 因此我知道所有内容的粗略尺寸 然而 我遇到的第一个问题是设置屏幕的左半部分 所以左半部分由一个框架组成 我们称之为Main
  • 如何替换已弃用的 ggplot2 函数 aes_string:接受任意数量的命名字符串来指定美学映射?

    aes string我在使用 ggplot2 编程时使用了一些方便的行为 但aes string已被弃用 我相信是从 ggplot2 版本 3 4 0 开始 我正在努力思考如何很好地替换它 具体来说 我之前创建了通过省略号接受任意字符串参数
  • 错误 403:scrapy 中未处理或不允许 HTTP 状态代码

    这是我为抓取 justdial 网站而编写的代码 import scrapy from scrapy http request import Request class JustdialSpider scrapy Spider name j
  • WebRTC - 在通信过程中更改视频流

    我的目标是使用 webrtc Web 应用程序在视频或音频通话中启用屏幕共享 好吧 我发现我可以使用MediaStreamTrack applyConstraints 更改视频属性 但是否可以更改视频源 进一步说明如何将视频添加到现有音频流
  • 从 C++ 调用 C# 方法而不使用 COM

    有没有办法创建 C 对象并从非托管 C 调用方法 但不使用 COM Iterop 我正在寻找类似 JNI 但适用于 Net 的东西 您可以在其中手动创建 VM 创建对象等 如果您使用 C CLI 那么您可以直接与托管世界和非托管代码交互 因
  • Python Selenium“WebDriver”对象没有属性错误

    我正在尝试从中文网站上抓取一些由 javascript 生成的内容 我正在使用 Selenium 和 Python 因为我无法直接抓取 javascript 内容 coding utf 8 from selenium import webd
  • Pandas:按满足条件的列进行分组

    我有一个包含三列的数据集 评级 品种和狗 import pandas as pd dogs breed Chihuahua Chihuahua Dalmatian Sphynx dog True True True False rating
  • 获取 Chrome 浏览器的最新发布版本号

    我正在尝试找出一种相当稳定的方法来以编程方式确定 chrome 浏览器的最新发行版本号 它不必是万无一失的 因为它只是一个很好的功能 每当结果看起来 可疑 时我就可以混合出来 似乎没有 API 有吗 我不想依赖第三方手动处理这些事情 我不想
  • “按 NULL 排序”是什么意思

    我使用 oracle 11g 下面的 line order by null 意味着什么 select f value row number over order by null as id from tableName The OVER 条
  • 如何使用 Python 以 Gmail 作为提供商发送电子邮件?

    我正在尝试使用 python 发送电子邮件 Gmail 但出现以下错误 Traceback most recent call last File emailSend py line 14 in
  • 通过 MySQL 数据库更改发送 WebSocket 更新哪个更有效

    我目前正在尝试使用 WebSockets 以减少 消除在潜在的低带宽环境中对持续 AJAX 请求的需求 所有设备都兼容 WebSocket 所以没有问题 我试图将其保留为原生 PHP WebSocket 没有 Node js 或其他框架 库
  • 什么是智能指针?何时应该使用智能指针?

    什么是智能指针 何时应该使用智能指针 UPDATE 这个答案相当古老 因此描述了当时 好的 即 Boost 库提供的智能指针 从 C 11 开始 标准库已经提供了足够的智能指针类型 因此您应该倾向于使用std unique ptr std
  • 对话框后面显示的垫选择选项

    我将表单输入 带有选项的垫选择和带有选项的自动完成字段也包含到垫对话框中 问题是选项显示在对话框后面 我已经遇到过这些解决方案解决方案1但并没有解决这个问题 这是我的代码
  • CMake - 如何使库的私有标头可供其测试使用?

    因此 我正在将项目的一部分制作为一个库 其中一些标头是该库的接口 其余部分是库本身私有的 因此 对于我的库 CMAKE 部分如下所示 add library PROJECT NAME PROJECT SOURCES PROJECT BINA