cmake 仅包含标头库
Posted
技术标签:
【中文标题】cmake 仅包含标头库【英文标题】:cmake include header only library 【发布时间】:2016-07-02 11:09:26 【问题描述】:我想将spdlog 包含到我的一个项目中。它是一个只有标题的库。我正在构建的项目正在使用 cmake。目前我正在使用
include_directories('src/logger/spdlog/')
在 cmake 中并将库包含为
#include <spdlog/spdlog.h>
在 logger 文件夹内的 logs.h 中。我收到致命错误,没有这样的文件或目录。在我的应用程序中包含相同库的正确方法是什么。
【问题讨论】:
尝试在#include 中使用“”而不是 @JoseLinares 正在与 合作。正在添加额外的逗号:p @xandercage 请问什么是"inverted-commas"?您的意思是在CMakeLists.txt
代码中将 '
替换为 ""
吗?
只是删除它们。他们不需要
【参考方案1】:
Cmake 提供专门用于“仅头文件库”的接口库。我建议执行以下操作:
-
创建如下文件结构
third-party\spdlog\include
-
Git 将 spdlog 存储库克隆到名称为
spdlog
的 include
目录中
使用以下内容创建third-party\spdlog\CMakeLists.txt
find_package(Threads REQUIRED)
add_library($TARGET_LOGGER INTERFACE)
# add_library(spdlog::spdlog_header_only ALIAS $TARGET_LOGGER)
target_include_directories($TARGET_LOGGER INTERFACE "$<BUILD_INTERFACE:$CMAKE_CURRENT_LIST_DIR/include>"
"$<INSTALL_INTERFACE:$CMAKE_INSTALL_INCLUDEDIR>")
target_link_libraries($TARGET_LOGGER INTERFACE Threads::Threads)
-
在项目的 CMakeLists.txt 中定义 TARGET_LOGGER。使用
target_link_libraries($TARGET_PROJECT LINK_PUBLIC $TARGET_LOGGER)
将此目标链接到您的项目。也别忘了
add_subdirectory(
third-party\spdlog
)
然后,在您的项目中,您可以使用#include "spdlog/spdlog.h"
来包含该库
【讨论】:
这是最好的答案,并使用现代 cmake 实践【参考方案2】:您可能离开了一个目录。尝试任一
include_directories("src/logger")
在CMakeLists.txt
,或
#include <spdlog.h>
在源代码中。
【讨论】:
感谢其中之一,但我忘记的主要问题是inverted-commas
,同时在 include_directories 中添加路径现在可以正常工作:)【参考方案3】:
首先,不要使用单引号'
,而是使用双引号"
,或者如果它们不包含空格,则只使用纯字符串。
我建议您使用 find_path
而不是直接添加包含。在那里你可以添加PATH_SUFFIXES
。如果找不到标头,您会在配置过程中收到一条消息,这样更容易发现错误。
文档:https://cmake.org/cmake/help/v3.6/command/find_path.html
【讨论】:
以上是关于cmake 仅包含标头库的主要内容,如果未能解决你的问题,请参考以下文章
CMake 是不是将包含的标头中的所有内容编译到可执行文件中,还是仅将主类中使用的部分编译为可执行文件?
cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接