Не удается найти каталог в контексте main. cpp (Allegro с CMake) - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь создать библиотеку, которая связывается с медиа-библиотекой allegro5, используя CMake. И затем я хочу использовать свою библиотеку в исполняемом файле.

Моя структура каталогов:

src
 |----core
        |------src
        |------tests
        |------CMakeLists.txt
 |----main.cpp
 |----CMakeLists.txt

Файл CMakeLists.txt внутри основной папки:

set(MY_HEADERS #My header files here)
set(MY_SRC #My source files here)

add_library(MyLib ${MY_HEADERS} ${MY_SRC})
target_include_directories(MyLib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")

## Allegro Lib

set(ALLEGRO_DIR "${PROJECT_SOURCE_DIR}/packages/allegro5/include")

if(WIN32)
    file(GLOB ALLEGRO_LIB "${PROJECT_SOURCE_DIR}/packages/allegro5/windows/x86/lib/*.lib")
    add_library(Allegro SHARED IMPORTED)
    set_target_properties(Allegro PROPERTIES
        INTERFACE_INCLUDE_DIRECTORIES ${ALLEGRO_DIR}
        IMPORTED_IMPLIB ${ALLEGRO_LIB}
    )
    target_link_libraries(MyLib PRIVATE Allegro)
    file(GLOB ALLEGRO_DLL "${PROJECT_SOURCE_DIR}/packages/allegro5/windows/x86/bin/*.dll")
    foreach(dll ${ALLEGRO_DLL})
        add_custom_command(TARGET MyLib POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            ${dll} $<TARGET_FILE_DIR:MyLib>)
    endforeach()
endif()

Теперь в моем CMakeLists.txt верхнего уровня:

cmake_minimum_required(VERSION 3.15)

project(MyProject)
enable_testing()

add_subdirectory(core)
add_executable(MyGame main.cpp)
target_link_libraries(MyGame MyLib)

В моей IDE (Visual Studio) я вижу, что оператор include для "allegro5 / allegro.h" в моих исходных файлах находится внутри В основной папке выдается предупреждение «Не удается найти каталог allegro5 в путях поиска ... в контексте ../src/main.cpp".

При сборке проекта появляются ошибки:

Cannot open source file 'allegro5/allegro'
Cannot open include file 'allegro5/allegro.h': No such file or directory.

Эта ошибка возникает, только если я ссылаюсь MyLib на main. cpp. (У моего основного нет никакого кода, только заявление о приветствии):

// #include "MyLib.hpp"

int main(int argc, const char *argv[])
{
    /*const auto engine = &MyLib::EngineManager::getInstance();
    engine->start();
    const auto display = &MyLib::DisplayManager::getInstance();

    auto displayConfig = DisplayConfig();
    displayConfig.fullscreen = false;
    const auto displayId = display->createDisplay(displayConfig);*/
}

Я думаю, это как-то связано с видимостью, которую я где-то устанавливаю? Я не могу понять, как это исправить. Спасибо за помощь, спасибо!

РЕДАКТИРОВАТЬ:

Когда PRIVATE до PUBLIC, я получаю следующую ошибку компоновщика:

LNK2019 unresolved external symbol __imp_al_install_system referenced in function "public: static void __cdecl mylib::EngineManager::start(void)" (?start@EngineManager@mylib@@SAXXZ)   C:\Users\xxx\src\out\build\x64-Debug\src    C:\Users\xxx\src\out\build\x64-Debug\main.cpp.obj

1 Ответ

1 голос
/ 08 февраля 2020

Каталог включения для allegro5 определен как ALLEGRO_DIR в вашем CMake:

${PROJECT_SOURCE_DIR}/packages/allegro5/include

Следовательно, с #include "allegro5/allegro.h" будет добавлен полный путь к файлу заголовка:

${PROJECT_SOURCE_DIR}/packages/allegro5/include/allegro5/allegro.h

Убедитесь, что этот путь правильный и файл существует.

Кроме того, вы устанавливаете каталоги INTERFACE include для импортированной цели Allegro, но связываете ее с MyLib, используя ключевое слово PRIVATE. Это означает, что требования использования Allegro не распространяются на MyGame. Вместо этого вы должны использовать PUBLIC для этого шага ссылки, если хотите, чтобы INTERFACE_INCLUDE_DIRECTORIES из Allegro также был транзитивно распространен в MyGame:

    target_link_libraries(MyLib PUBLIC Allegro)

CMake имеет хороший пример демонстрирует это в своей документации.

...