【问题标题】:CMake Include third party header for a non cmake libraryCMake 包含非 cmake 库的第三方标头
【发布时间】:2018-09-09 20:51:31
【问题描述】:

我有一个这样的项目:

project
  CMakeLists.txt
  src
    CMakeLists.txt
    Mylib.cpp
  thirdparty
    somelib
      include
        header.h

我正在尝试使用 #include "header.h" 在我的代码中包含 header.h,但是预处理器找不到标头。

我已尝试在 src CMakeLists.txt 中使用 target_include_directories 添加第三方包含目录,但这无济于事。我已经尝试了thirdparty/somelib/include 和../thirdparty/somelib/include 作为路径。

如何正确获取包含路径上的标头?

【问题讨论】:

  • 在target_include_directories(foo PUBLIC ${CMAKE_SOURCE_DIR}/thirdparty/somelib/include) 中使用项目树的顶级目录(又名根)很方便。如果这可行,并且您还安装了目标,您可能需要使用生成器表达式进行调整,但让我们一步一步来。
  • 那行得通-我尝试过同样的事情,但已将包含的目录标记为 PRIVATE 并将其包含在我的公共标头中,这显然不起作用!谢谢!
  • 好,我会把它转换成答案。
  • 您可以将第三方库添加到您的项目中,作为仅标头库。这是一个完整的示例:mariobadr.com/creating-a-header-only-library-with-cmake.html

标签: c++ cmake


【解决方案1】:

将我的评论转换为答案并进一步阐述一些细节

使用项目树的顶级目录(即根目录)很方便,它还具有保护您免受依赖目标上可能发生的任何位置更改的优势

target_include_directories(foo PUBLIC ${CMAKE_SOURCE_DIR}/thirdparty/somelib/include)

确保根据需要调整可见性(请参阅docs)。此外,如果您计划安装您的目标,您应该调整已安装头文件的位置,使其与构建期间使用的头文件(尤其是 API 的面向用户的头文件)不同,使用像这样的生成器表达式

target_include_directories(foo PUBLIC
  $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/thiirdpart/somelib/include/>
  $<INSTALL_INTERFACE:include/thirdparty/somelib/include>  # or whichever structure you choose
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多