c++ - CMakeLists.txt 用于 C++ 项目中的第三方 C 文件
问题描述
我的 C++ 项目doggo
有一个doggo/external/
第三方代码目录。目前它包含gtest和一个 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/
,就像这里所做的那样:randomkit from numpy。
如何让 randomkit 在我的doggo/external/
目录中构建?应该是doggo/external/CMakeLists.txt
什么样子的?
然后我应该能够通过在extern "C" { ... }
块中包含头文件来包含 C 头文件以在我的 x.cpp 文件中使用(详情请点击此处)。
更新:如何在这里安装 randomkit?我已经包含了一个像上面那样的 CMakeLists.txt 条目,但是对于 randomkit,目录看起来像,
external
├── CMakeLists.txt
├── gtest
│ └── ...
└── randomkit
├── CMakeLists.txt
├── distributions.c
├── distributions.h
├── randomkit.c
└── randomkit.h
和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*")
(第二个 DESTINATION 注释掉表明我也尝试过)
然而,当我为我的顶级项目运行构建步骤时,我doggo
尝试执行以下操作时出错#include <randomkit/distributions.h>
:
doggo/src/random_fooz.cpp:10:37: fatal error: randomkit/distributions.h: No such file or directory
更新 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)
解决方案
在randomkit/CMakeLists.txt
写:
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*")
在 mainCMakeLists.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
构建时,必须在源代码树中找到包含文件。
推荐阅读
- ruby-on-rails - 过期的 s3 预签名网址
- c - 为什么这段代码不打印提示或读取有效数据?
- javascript - 为具有相同 id 的两个表添加序列号
- c# - Hermite 曲线的子曲线不适合原始曲线
- php - Laravel CRUD 更新数据到 MySQL 失败
- asp.net - 如何在 aws lambda 更新 asp.NET 无服务器代码以部署它
- javascript - 在烧瓶应用程序中链接外部 .js 文件时未应用 JavaScript 功能
- javascript - 如何添加到 Javascript 中的函数?
- node.js - 如何使用 NPM 将两个版本的 Bootstrap 安装到单个 node_modules 文件夹中?
- reactjs - 当我在地图函数中添加组件 CommentCreate 时,我得到了太多的重新渲染并进入无限循环