无法在 main.cpp 的上下文中找到目录(带 CMake 的 Allegro)
Cannot find directory in context of main.cpp (Allegro with CMake)
我正在尝试使用 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" 的 include 语句位于核心文件夹内,给我警告 "Cannot find directory allegro5 in search paths ... in context of ../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);*/
}
我想这与我在某处设置的可见性有关?我不太清楚如何解决。感谢您的帮助,谢谢!
编辑:
当 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
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
关键字将其 link 设置为 MyLib
.这意味着 Allegro
的使用要求 而不是 传播到 MyGame
。如果您希望 Allegro
的 INTERFACE_INCLUDE_DIRECTORIES
也传递传播到 MyGame
:
,则您应该将 PUBLIC
用于此 link 步骤
target_link_libraries(MyLib PUBLIC Allegro)
CMake 在他们的文档中很好地 example 证明了这一点。
我正在尝试使用 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" 的 include 语句位于核心文件夹内,给我警告 "Cannot find directory allegro5 in search paths ... in context of ../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);*/
}
我想这与我在某处设置的可见性有关?我不太清楚如何解决。感谢您的帮助,谢谢!
编辑:
当 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
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
关键字将其 link 设置为 MyLib
.这意味着 Allegro
的使用要求 而不是 传播到 MyGame
。如果您希望 Allegro
的 INTERFACE_INCLUDE_DIRECTORIES
也传递传播到 MyGame
:
PUBLIC
用于此 link 步骤
target_link_libraries(MyLib PUBLIC Allegro)
CMake 在他们的文档中很好地 example 证明了这一点。