В моей библиотеке я отделил заголовки publi c от источника, поместив их в 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-файле был включен заголовок с частным заголовком.
Я поэкспериментировал с некоторыми настройками видимости и выполнил поиск в Google, но я не нашел ответа.
Как другие справляются с разделением заголовков private и publi c.
Конечно, я всегда могу использовать относительный путь в библиотеке, но я бы предпочел не видеть это как:
#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"
)
Полная версия 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
dir библиотеки не находится в пути включения.