CMakelists.txt用于C 项目中的第三方C文件
CMakeLists.txt for third-party C files within C++ project
我的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
命令才能执行。构建时,必须在源树中找到包含文件。
- 如何调试visual studio 2017生成的C++代码.android中的SO文件和其他第三方库
- 如何将第三方 dll、标头和库文件与 Node N-API 一起使用
- CMakelists.txt用于C 项目中的第三方C文件
- 在Linux上使用Cmake时,我该如何告诉PVS-Studio忽略第三方库中的所有文件
- Borland C++ 5.02 中使用第三方头文件的多线程
- 将第三方库与程序可执行文件分开
- 将第三方头文件与 Rcpp 一起使用
- 隐藏第三方C++头文件的内容
- 在swig.i文件中,如何为基于mfc的第三方dll解析ms-windows-vc++typedef类型
- 将第三方模块的控制台输出/错误重定向到日志文件
- C++第三方库包含不存在的头文件
- 在源代码树中放置第三方头文件的位置
- 获取第三方点击一次应用程序的配置文件夹
- 当向第三方提供库时,C++include文件是否属于安全漏洞
- 用于第三方API的c++ #include -永远找不到一些头文件
- 如何禁止其他开发人员在c++中包含第三方头文件
- 如果我对头文件做了一个小的改变,我需要重新编译第三方库吗?
- 在Qt中使用第三方dll(没有.lib文件可用)
- 调用第三方可执行文件时调试分段错误
- 与第三方头文件相关的C++Builder歧义错误