CMakeLists.txt 用于 C++ 项目中的第三方 C 文件

2024-02-04

我的 C++ 项目doggo has a doggo/external/第三方代码的目录。目前它包含gtest https://github.com/google/googletest和 CMakeLists.txt:

# Google gtest for unit testing.
add_subdirectory(gtest)
message("gtest include dir: ${gtest_SOURCE_DIR}")
include_directories(${gtest_SOURCE_DIR})

我的顶级doggo/CMakeLists.txt 包含行add_subdirectory(external)查找并构建第三方库。一切都像一个魅力——我可以包括 gtest#include <gtest/gtest.h>。现在我想将 randomkit C 库添加到doggo/external/,就像这里所做的那样:来自 numpy 的 randomkit https://github.com/deepmind/torch-randomkit/tree/master/randomkit.

我怎样才能让 randomkit 构建在我的doggo/external/目录?应该做什么doggo/external/CMakeLists.txt看起来像?

然后我应该能够通过将标头包含在我的 x.cpp 文件中来包含 C 标头extern "C" { ... } block (详细信息在这里 https://stackoverflow.com/a/13694703/3765905).

UPDATE: 这里如何安装randomkit? 我已经包含了一个与上面类似的 CMakeLists.txt 条目,但是对于 randomkit,该目录看起来像,

external
├── CMakeLists.txt
├── gtest
│   └── ...
└── randomkit
    ├── CMakeLists.txt
    ├── distributions.c
    ├── distributions.h
    ├── randomkit.c
    └── randomkit.h

and the randomkit/CMakeLists.txt:

project(randomkit)
file(GLOB SOURCES "*.c")
add_library(randomkit SHARED ${SOURCES})
INSTALL(
    DIRECTORY ${CMAKE_SOURCE_DIR}/
    DESTINATION "/usr/local/"
    #DESTINATION ""
    FILES_MATCHING PATTERN "*.h*")

(第二个目的地被注释掉以表明我也尝试过)

然而,当我为我的顶级项目运行构建步骤时doggo我尝试时遇到错误#include <randomkit/distributions.h>:

doggo/src/random_fooz.cpp:10:37: fatal error: randomkit/distributions.h: No such file or directory

UPDATE 2:doggo/CMakeLists.txt:

project(doggo)
# Find and build third-party libraries
add_subdirectory(external)
# Add source dirs to the search path so cmake can find headers
include_directories(${CMAKE_SOURCE_DIR}/include/)
# Collect source files and build
file(GLOB_RECURSE doggo_srcs ${CMAKE_SOURCE_DIR}/src/*.cpp)
add_library(doggo ${doggo_srcs})
# Setup executables
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/bin/)
add_subdirectory(exec)
# Tests
add_subdirectory(test)

In the randomkit/CMakeLists.txt write:

project(randomkit)
file(GLOB SOURCES "*.c")
add_library(randomkit SHARED ${SOURCES})
target_include_directories(randomkit PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
INSTALL(
    DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
    DESTINATION "include"            # this a the subdirectory with ${CMAKE_INSTALL_PREFIX}
    FILES_MATCHING PATTERN "*.h*")

在主要CMakeLists.txt, 你做:

add_library(doggo ${doggo_srcs})
target_link_libraries(doggo PUBLIC randomkit)
target_include_directories(doggo PUBLIC ${CMAKE_SOURCE_DIR}/include/)

不要使用include_directories.

现在,因为randomkit目标有PUBLIC属性具有正确的包含目录,这些包含目录将在构建doggo库时自动使用。再说一次,因为doggo库在其公共接口中包含目录和库,所以链接到doggo的可执行文件将自动链接到这些库,并找到它们的包含文件。

请注意,INSTALL命令输入randomkit/CMakeLists.txt仅当您实际运行安装目标时才执行。构建时,必须在源代码树中找到包含文件。

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

CMakeLists.txt 用于 C++ 项目中的第三方 C 文件 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData

随机推荐

  • 使用 NestedScrollView 并向 ListView 下游提供 ScrollController

    我有一个NestedScrollView当我使用时 它可以很好地自动隐藏AppBar 我想要的一项功能 SliverAppBar 我遇到问题的地方是我使用ListView Builder作为下游的身体组件之一 我需要应用自己的ScrollC
  • Facebook 登录在发布应用程序之前可以使用发布 APK,但在发布相同 APK 后则不能使用

    Facebook 登录可以在发布应用程序之前使用发布 APK 但在 Play 商店中发布相同的 APK 后则不能使用 我正在尝试实施Facebook登入过去两天进入我的应用程序 我已遵循所有步骤并添加了两个密钥哈希 对于debug and
  • Symfony2:如何覆盖核心模板?

    我试图通过创建来覆盖 SymfonyGeneratorBundle 模板 app Resources SensioGeneratorBundle skeleton crud views index html twig 该文件应替换 vend
  • oracle视图和网络流量

    我真的无法理解这一行来自Oracle 电子商务套件开发人员指南 http docs oracle com cd E18727 01 doc 121 e12897 T302934T303920 htm方法 当使用视图时 网络流量被最小化 因为
  • 在 R 中使用 for 循环绘制许多直方图

    我有一个 csv 文件 其中包含如下数据 RI Na Mg Al Si K Ca Ba Fe Type 1 1 51793 12 79 3 50 1 12 73 03 0 64 8 77 0 00 0 00 BWF 2 1 51643 12
  • IIS 上的 WordPress 永久链接?

    我在 Windows 7 IIS 上使用 WordPress 进行开发 我正在 WordPress 中上传博客文章的图像 该图像在网站上显示良好 但一旦我启用永久链接 图像就不再起作用 并且以后上传的任何图像都会返回错误 HTTP Erro
  • Python urllib2 URLError HTTP 状态代码。

    我想在引发 URLError 异常时获取 HTTP 状态代码 我尝试过这个但没有帮助 except URLError e logger warning It seems like the server is down Code str e
  • 如何使用web-api上传文件

    客户端代码
  • libgdx- pixmap:我可以以某种方式改变线的宽度吗?

    我想画一条线 然后生成一个纹理 使用 libgdx 我发现使用像素图从圆形 矩形和线条创建纹理非常简单 但我没有找到如何设置绘制形状的线宽 是否可以设置像素图的线宽 这是我到目前为止得到的代码 我尝试画两个实心圆并用一条线将它们连接起来 P
  • 如何选择列名并将其用作 Python 中变量名的输入?

    原问题 我正在编写一个 while 循环来循环某些列 在这个 while 循环中 我想创建一个变量 其名称部分由它循环的列名组成 x 2 length len grouped class columns while x
  • Cocoa:NSApp beginSheet 设置应用程序委托?

    我正在尝试在我的应用程序中显示自定义工作表 但我认为我做错了什么 虽然一切seems为了工作得很好 我有一个相当奇怪的副作用 花了几个小时才弄清楚 事实证明 每次我在应用程序中显示工作表时 应用程序委托都会设置为工作表的实例 因此我的控制器
  • 在 CMake 中设置 Clang 库的路径

    我从 git 构建 llvm 并希望在项目中使用这些库 尤其是 libclang makefiles 是通过 CMake 生成的 对于 LLVM 部分 我找到了设置LLVM DIR重新路由 llvm 库的路径 但对于 Clang 我找不到这
  • R中的ggtern等高线图[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有这个数据文件 https www dropbox com s xk8zyu9f0rw77eu N90 p 0 350 eta 90 W
  • 如何使正则表达式的一部分可选?

    假设我有以下正则表达式 它与末尾带有分号的字符串相匹配 它将匹配除空字符串之外的任何字符串 如下所示 我尝试使用这个 但这没有用 我的问题是 我怎样才能使 的一部分 可选 因此用户不必在字符串中放置任何字符 为了使 可选 你可以这样做 被称
  • Eclipse 调试过滤不需要的包

    我已经使用 Eclipse 进行开发 2 年了 但是在调试过程中我仍然很难理解这个过滤器概念 我通常在远程端口模式下调试 大多数时候 My Eclipse 会捕获不需要的包中的断点 异常 包通常来自 Spring Java ThreadPo
  • 如何从 XML 文件中的特定节点获取值?

    从这个 XML 代码可以看出
  • 用于记录每一行代码的 C++ 宏

    在我最近与经理的一次讨论中 他提到他的一位前客户使用 C 宏来记录每行代码的信息 他们所要做的就是在开始运行之前启用环境变量 当然 环境变量仅在测试台中启用 日志还提到了所使用的变量及其相应的值 例如 对于该行 a a b 日志会显示如下内
  • Swift inputAccessoryView 覆盖错误

    我的外观遇到了奇怪的错误inputAccessoryView 在转换过程中 它看起来像这样 转换后 它应该出现 我像这样覆盖该属性 override var inputAccessoryView UIView get if composeV
  • 发生“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的第一次机会异常

    当在 Newtonsoft JObjects 上使用动态时 我得到了很多Microsoft CSharp RuntimeBinder RuntimeBinderException在我的调试输出中 虽然异常肯定被捕获在 Microsoft C
  • CMakeLists.txt 用于 C++ 项目中的第三方 C 文件

    我的 C 项目doggo has a doggo external 第三方代码的目录 目前它包含gtest https github com google googletest和 CMakeLists txt Google gtest fo