【问题标题】:target_include_directories() does not find header filestarget_include_directories() 找不到头文件
【发布时间】:2020-03-11 10:16:57
【问题描述】:

在我的项目中,我尝试练习良好的 Cmake 用法,并希望将所有 include_directories() 更改为 target_include_directories()。 我的项目结构是这样的:

Project
| CMakeLists.txt
|--external
|--Lib_A
|   CmakeLists.txt
|--Lib_B
|   CmakeLists.txt
|-- ...

我的项目/CmakeLists.txt 如下所示:

add_subdirectory(Lib_A)
add_subdirectory(Lib_B)

还有像这样的 Lib_A/CmakeLists.txt:

set(SOURCES file1.cpp file1.h file2.cpp file2.h ...)
add_library(Lib_A STATIC ${SOURCES})
target_include_directories(Lib_A PRIVATE
   ${CMAKE_SOURCE_DIR}/Lib_B
   ${CMAKE_SOURCE_DIR}/external/rapidjson/include
)

现在我们正在了解发生错误的位置。 Lib_B/CmakeLists.txt 是

set(SOURCES fileX.cpp fileX.h fileY.cpp fileY.h ...)
add_library(Lib_B STATIC ${SOURCES})
target_include_directories(Lib_B PUBLIC
   ${CMAKE_SOURCE_DIR}/Lib_A
   ${CMAKE_SOURCE_DIR}/external/rapidjson/include
   ...
)
target_link_libraries(Lib_B PUBLIC Lib_A Lib_C Lib_D ...)

现在我在构建项目时遇到错误,说明在 Lib_B 的 .cpp 文件中,它没有找到包含 Lib_A/file2.h:“没有这样的文件或目录”。 我已经尝试切换关键字 PUBLIC、PRIVATE 和 INTERFACE,但似乎没有任何效果,除了当我将关键字从 PRIVATE 设置为 PUBLIC 或 INTERFACE 时,我收到更多关于在 Lib_A 中找不到标题的错误。有趣的是,如果我在 Lib_B/CmakeLists.txt 中进行此更改

set(SOURCES fileX.cpp fileX.h fileY.cpp fileY.h ...)
include_directories(${CMAKE_SOURCE_DIR}/Lib_A) #this was taken..
add_library(Lib_B STATIC ${SOURCES})
target_include_directories(Lib_B PUBLIC
   ${CMAKE_SOURCE_DIR}/external/rapidjson/include
   ...                                         #..from here
)
target_link_libraries(Lib_B PUBLIC Lib_A Lib_C Lib_D ...)

错误不再发生。所以这似乎是与 target_dir... 命令有关的本地错误,有点我看不出有什么问题以及为什么它不起作用。

【问题讨论】:

  • Lib_A/CmakeLists.txt 永远不会在搜索路径中添加 ${CMAKE_SOURCE_DIR}/Lib_A。它添加了“${CMAKE_SOURCE_DIR}/Lib_B”。错别字?
  • 还要注意Lib_A会被添加到包含路径中,所以你应该#include "file2.h",而不是Lib_A/file2.h。
  • 谢谢,我都试过了,但我仍然有这些错误。
  • 嗯,Lib_A 有 ${CMAKE_SOURCE_DIR}/Lib_B 包含目录...似乎复制/粘贴错误。仅在本例中?
  • 是的,每个库都应该包含其自己的标头的路径,假设它们与该库相关并且需要编译该库。这不会自动发生,您必须明确了解要用于每个库的构建要求的包含目录。

标签: c++ cmake


【解决方案1】:

我发现了问题:错误来自另一个模块,其中包含一个包含 Lib_A/file2.h 的标头。切换到现代 Cmake 命令阻止其他模块获取此包含路径,因此引发错误。

将包含路径添加到有问题的模块解决了这个问题。

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2016-03-31
    • 2021-02-02
    • 2015-04-28
    • 2016-01-01
    相关资源
    最近更新 更多