【发布时间】:2020-04-11 14:05:29
【问题描述】:
在我的库中,我将公共标头与源代码分开,将它们放入include 和src。在使用 Cmake 时,我的库中有这个:
target_include_directories(${PROJECT_NAME}
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/include/Thoth"
"${CMAKE_CURRENT_SOURCE_DIR}/src"
INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/include"
)
这背后的想法是我希望最终用户(使用库)只有 include 目录,因此它们必须像这样包含:
#include <Thoth/file.h>
但在库中我可以省略Thoth。
现在我还在库中包含了src 目录,因为那里有一些私有头文件。
这没问题,我可以将每个文件都包含在预期的路径中。
在编译使用该库的 exe 时,该库会成功编译,但会在 exe 本身上失败。
这是由于在库 src 中找不到标头。现在该文件未包含在 exe 中,因为它是私有的。但这是因为 exe 包含一个包含私有标头的标头。
我已经尝试了一些可见性设置并进行了谷歌搜索,但我没有找到答案。
其他人如何处理分离私有和公共标头。
当然,我总是可以在库中使用相对路径,但我宁愿避免这种情况:
#include "../src/private.h"
很丑。
当然,如果这是唯一的方法,那就这样吧。虽然我认为其他人会遇到这种情况并想要一个解决方案。
我能想到的另一种方法是只公开包含 src 文件夹并相信用户不包含私有标头,但这会污染包含路径并且是不可取的。
完整的库 CMake:
cmake_minimum_required(VERSION 3.13)
project(Thoth)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_library(${PROJECT_NAME}
src/IndentData.cpp
src/RenderComponent.cpp
src/RenderElement.cpp
src/RenderManager.cpp
)
target_include_directories(${PROJECT_NAME}
PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/include/Thoth"
"${CMAKE_CURRENT_SOURCE_DIR}/src"
INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/include"
)
完整的 exe CMake:
cmake_minimum_required(VERSION 3.13)
project(myExe)
add_subdirectory(lib/Thoth)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC Thoth)
至于文件,显示起来有点困难,但问题是RenderComponent.hpp(在include/Thoth 内)包含IndentData.hpp(在src 内)。因此,当 exe 包含 #include <Thoth/RenderComponent.hpp> 时,库的 src 目录不在包含路径中。
【问题讨论】:
-
请举例
-
很难在不使文件过大的情况下显示大部分文件的一部分。希望我添加的内容有所帮助。
-
那么您有一个包含私有标头的公共标头?您将不得不将
RenderComponent.hpp更改为不包括IndentData.hpp。