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

CMakeLists.txt for third-party C files within C++ project

本文关键字:第三方 文件 项目 txt 用于 CMakelists      更新时间:2023-10-16

我的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来自Numpy。

如何在我的doggo/external/ dir中构建RandomKit?doggo/external/CMakeLists.txt应该是什么样的?

然后,我应该能够通过在extern "C" { ... }块中包含标头(详细信息(。

update :如何在此处安装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*")

(第二个目的地评论以表明我也尝试过(

然而,当我为我的顶级项目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*")

在主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的可执行文件将自动链接到这些库,并找到其包含文件。

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