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 文件 的相关文章

随机推荐

  • 使用 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