【问题标题】:Cannot find directory in context of main.cpp (Allegro with CMake)在 main.cpp 上下文中找不到目录(带有 CMake 的 Allegro)
【发布时间】:2020-05-24 11:22:50
【问题描述】:

我正在尝试使用 CMake 创建一个链接到 allegro5 媒体库的库。然后,我想在可执行文件中使用我的库。

我的目录结构是:

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) 中,我看到源文件中“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.

仅当我在 main.cpp 中引用 MyLib 时才会发生此错误。 (我的main没有任何代码,只是一个hello world语句):

// #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);*/
}

我猜这与我在某处设置的可见性有关?我无法弄清楚如何解决。感谢您的帮助,谢谢!

编辑:

PRIVATEPUBLIC 时,我收到以下链接器错误:

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

【问题讨论】:

    标签: c++ cmake allegro5


    【解决方案1】:

    allegro5 的包含目录在您的 CMake 中定义为 ALLEGRO_DIR

    ${PROJECT_SOURCE_DIR}/packages/allegro5/include
    

    因此,使用#include "allegro5/allegro.h",将附加头文件的完整路径:

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

    确保此路径正确且文件存在。

    此外,您在导入的Allegro 目标上设置了INTERFACE 包含目录,但您使用PRIVATE 关键字将其链接到MyLib。这意味着Allegro 的使用要求不会传播到MyGame。如果您希望AllegroINTERFACE_INCLUDE_DIRECTORIES 也传递到MyGame,则应该在此链接步骤中使用PUBLIC

        target_link_libraries(MyLib PUBLIC Allegro)
    

    CMake 有一个很好的 example 在他们的文档中展示了这一点。

    【讨论】:

    • 感谢您的帮助。当我链接到 Allegro 时,我更改为 PUBLIC。然后我在从 MyLib 链接到 Allegro 时收到错误“未解析的外部符号”。
    • @swdon 在使用PRIVATE 时,MyLib 是否构建成功?据我所知,从PRIVATE切换到PUBLIC应该不会改变MyLibAllegro之间的链接接口。随时将特定错误添加到您的问题帖子中。
    • 对不起,错了。链接器错误在MyGame 项目中。它无法链接到 Allegro5。我会发布确切的错误,但我认为关于链接器错误还有很多其他问题,所以我会先检查它们,然后再浪费你的时间:)
    • @swdon 如果MyGame 没有链接到Allegro5,您可能还必须在调用set_target_properties() 时将INTERFACE_LINK_LIBRARIES 设置为${ALLEGRO_LIB}
    • 我一直在为 x64 构建...非常感谢!
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多