首页 > 解决方案 > 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)

标签: c++ccmake

解决方案


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构建时,必须在源代码树中找到包含文件。


推荐阅读