【发布时间】: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 包含目录...似乎复制/粘贴错误。仅在本例中?
-
是的,每个库都应该包含其自己的标头的路径,假设它们与该库相关并且需要编译该库。这不会自动发生,您必须明确了解要用于每个库的构建要求的包含目录。