Я пытался найти ответ на этот вопрос. Есть похожие вопросы, но ни один из них не отвечает на мой.
Я пытаюсь создать библиотеку, которая зависит от пары других внешних библиотек. У меня есть внешние библиотеки в виде git подмодулей, и я сам собираю их в CMake, используя add_subdirectory, за которым следует target_link_library.
После этого я могу использовать внешние библиотеки и включать их заголовочные файлы в любой исходный файл в моя библиотека, которую я добавил с помощью target_sources, а также в любом заголовочном файле, в который входит хотя бы один из этих исходных файлов.
Например, у меня есть внешняя библиотека glm и вызов target_sources(myLib PRIVATE Application.cpp)
в моей библиотеке. Заголовочные файлы в моей библиотеке добавляются в проект с помощью target_include_directories.
Теперь я могу сделать #include <glm/glm.hpp>
в приложении. cpp файл без проблем.
У меня также есть Файл Application.hpp, включенный в файл Application. cpp. Поскольку он включен, это позволяет мне также делать #include <glm/glm.hpp>
в файле Application.hpp.
Однако теперь у меня также есть файл Core.hpp без соответствующего файла Core. cpp. Поскольку файл Core.hpp не включен ни в какие исходные файлы, выполнение #include <glm/glm.hpp>
приводит к ошибке, что файл не может быть найден.
Это мой root CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(Ivory)
set(CMAKE_CXX_STANDARD 20)
add_library(${PROJECT_NAME} SHARED)
# Determine compiler platform (x32 or x64)
math(EXPR PLATFORM_BITS "8*${CMAKE_SIZEOF_VOID_P}")
set(PLATFORM "x${PLATFORM_BITS}")
# Determine target build platform
target_compile_definitions(${PROJECT_NAME}
PUBLIC
IVORY_WINDOWS
PRIVATE
IVORY_BUILD_DLL
)
# Set output directory
set(OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_SYSTEM_NAME}-${CMAKE_BUILD_TYPE}-${PLATFORM})
# Subdirectories
add_subdirectory(src)
add_subdirectory(tests)
add_subdirectory(executables)
target_include_directories(${PROJECT_NAME} PUBLIC include)
# External Libraries #
set(BUILD_SHARED_LIBS OFF)
# GLM
add_subdirectory(lib/glm)
target_link_libraries(${PROJECT_NAME} PRIVATE glm)
# GLEW
add_subdirectory(lib/glew)
target_link_libraries(${PROJECT_NAME} PRIVATE libglew_static)
# SFML
add_subdirectory(lib/SFML)
target_link_libraries(${PROJECT_NAME} PRIVATE sfml-window sfml-audio)
# SPDLOG
add_subdirectory(lib/spdlog)
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog)
# MinGW
target_link_libraries(${PROJECT_NAME} PRIVATE -static)
# Output Location
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
Это sr c CMakeLists.txt:
target_sources(${PROJECT_NAME}
PRIVATE
Application.cpp
)
Я использую CLion на Windows 10 с компилятором MinGW 7.3 (64 бит). Что я делаю не так?