Неустранимая ошибка: glew.h: нет такого файла или каталога при использовании make - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь построить CMakeLists.txt для своего проекта.Он должен включать SDL, OpenGL и GLEW, а также все мои файлы * .cpp и * .h в разных каталогах. Все файлы, используемые для создания проекта, находятся в каталоге исходного кода проекта, в котором вызывается cmake.

Ошибка:

In file included from /home/me/repos/AlchemyEngine/alchemy/alcEngine.cpp:1:0:
/home/me/repos/AlchemyEngine/alchemy/alcEngine.h:69:18: fatal error: glew.h: No such file or directory
 #include <glew.h>

Я думаю, это будет проще всегочтобы показать шаги по настройке этого проекта в Visual Studio (который работает так, как я использовал для разработки оттуда), и надеюсь, что я могу получить помощь, воссоздав настройку в моем файле CMakeLists.txt.

Настройка проекта вVisual Studio

1. Includes

Project -> *ProjectName* Properties -> VC++ Directories
Click Include Directories -> Click down-arrow- > edit

Browse for the include files (...\SDL2-OpenGL-GLEW-VC++\include)

2. Libraries

Project -> *ProjectName* Properties -> VC++ Directories
Click Library Directories -> Click down-arrow -> edit

Browse for the library files (...\SDL2-OpenGL-GLEW-VC++\lib)

3. Linkers

Project -> *ProjectName* Properties -> Linker -> Input
Click Additional Dependencies -> Click down arrow -> edit

Copy into box:
SDL2.lib
SDL2main.lib
SDL2_image.lib
OpenGL32.lib
glu32.lib
glew32.lib

4. DLLs

Build project with chosen entry point to create Debug folder with executable.

Copy the .dll files from the ...\SDL-OpenGL-GLEW-VC++\dropInExe folder and paste into the
Debug folder with the project executable
(...\*Project Folder*\Debug)

Вот мой CMakeLists.txt файл в его нынешнем виде

cmake_minimum_required (VERSION 3.5)
project (AlchemyEngine)

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

include_directories (
        alchemy/
        alchemy/event/
        alchemy/scene/
        alchemy/resource/
        alchemy/render/
        alchemy/util/
        game/
        #SDL2_OpenGL_GLEW_VC++/include
)

set( srcs
        alchemy/alcEngine.cpp
        alchemy/event/alcEvent.cpp
        alchemy/render/alcRenderer.cpp
        alchemy/render/alcSprite.cpp
        alchemy/resource/alcResource.cpp
        alchemy/resource/alcShader.cpp
        alchemy/resource/alcTexture.cpp
        alchemy/scene/alcObject.cpp
        alchemy/scene/alcScene.cpp
        alchemy/util/alcBlockAllocator.cpp
        alchemy/util/alcStackAllocator.cpp
        game/Player.cpp
        Main.cpp
)

add_library (libraries STATIC SDL2_OpenGL_GLEW_VC++/include/)

add_executable (alc ${PROJECT_SOURCE_DIR}/${srcs})

target_link_libraries(alc libraries)

set_target_properties(libraries PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(alc PROPERTIES LINKER_LANGUAGE CXX)

После настройки и генерации $CMAKE_SOURCE_DIR/build/bin содержит:

liblibraries.a  
glew32.dll  
libpng16-16.dll  
SDL2.dll  
SDL2_image.dll  
zlib1.dll

ЭтоМне кажется, что мой метод включения заголовочных файлов неправильный, но просмотр документации CMake и других сообщений обмена стека не дал лучших результатов.У меня есть ощущение, что это связано с шагом компоновщика, но я не могу понять, как указать зависимости в CMake.

Я могу tree и опубликовать вывод тоже, если структура проекта так важна дляэта проблема.

ФИНАЛЬНОЕ РЕДАКТИРОВАНИЕ:

Ошибка была исправлена ​​в ответе ниже, вот мой окончательный CMakeLists.txt для всех, кто интересуется

# Outputs executable(s) in {PROJECT_SOURCE_DIR}/build/bin/

# specify min version and project name
cmake_minimum_required (VERSION 3.5)
project (AlchemyEngine)

# set output paths for binaries/executable
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

# include project header files
include_directories (
        alchemy/
        alchemy/event/
        alchemy/scene/
        alchemy/resource/
        alchemy/render/
        alchemy/util/
        game/
)

# create source files definition
set( srcs
        alchemy/alcEngine.cpp
        alchemy/event/alcEvent.cpp
        alchemy/render/alcRenderer.cpp
        alchemy/render/alcSprite.cpp
        alchemy/resource/alcResource.cpp
        alchemy/resource/alcShader.cpp
        alchemy/resource/alcTexture.cpp
        alchemy/scene/alcObject.cpp
        alchemy/scene/alcScene.cpp
        alchemy/util/alcBlockAllocator.cpp
        alchemy/util/alcStackAllocator.cpp
        game/Player.cpp
        Main.cpp
)

# add a library target to be built from the source files
add_library (libraries STATIC SDL2_OpenGL_GLEW_VC++/lib/)
# specify include directories
target_include_directories(libraries PUBLIC SDL2_OpenGL_GLEW_VC++/include/)
# specify libraries to use when linking the library
target_link_libraries (libraries 
        ${PROJECT_SOURCE_DIR}/SDL2_OpenGL_GLEW_VC++/lib/glew32.lib
        ${PROJECT_SOURCE_DIR}/SDL2_OpenGL_GLEW_VC++/lib/glew32s.lib
        ${PROJECT_SOURCE_DIR}/SDL2_OpenGL_GLEW_VC++/lib/SDL2_image.lib
        ${PROJECT_SOURCE_DIR}/SDL2_OpenGL_GLEW_VC++/lib/SDL2.lib
        ${PROJECT_SOURCE_DIR}/SDL2_OpenGL_GLEW_VC++/lib/SDL2main.lib
)

# create the executable using the source files defined above
add_executable (alc ${PROJECT_SOURCE_DIR}/${srcs})
# specify the headers
target_include_directories(alc PUBLIC ${PROJECT_SOURCE_DIR})
# link the library to the project
target_link_libraries(alc libraries)

# force the linker language because there's some c stuff in the library files
set_target_properties(libraries PROPERTIES LINKER_LANGUAGE CXX)
set_target_properties(alc PROPERTIES LINKER_LANGUAGE CXX)

1 Ответ

2 голосов
/ 17 июня 2019

target_include_directories(libraries PRIVATE SDL2_OpenGL_GLEW_VC++/include/) должен использовать PUBLIC, чтобы этот путь был известен любой исполняемой цели, которая ссылается на libraries, например target_link_libraries(alc libraries).

Предполагается, что glew.h находится в каталоге SDL2_OpenGL_GLEW_VC++/include/.

Поскольку target_include_directories использует относительный путь (я почти уверен, что он относительно дерева источника)вам нужно убедиться, что это правильно для вашего дерева каталогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...