Статическая связь GLEW из источника с помощью cmake - PullRequest
0 голосов
/ 23 сентября 2018

Я немного новичок в cmake и совершенно новичок в glew, glfw и тому подобное.Я следую за каналом YouTube , чтобы узнать больше об игровых движках и программировании.

Моя проблема связана с подключением статической библиотеки glew в моем проекте с использованием cmake.

Во-первых,Я начинаю с исходного кода glew http://mcs.une.edu.au/doc/glew-devel/index.html.

. Я компилирую его следующим образом:

cd build; cmake ./cmake; make glew_s

Это добавляет каталог lib в каталог сборки с помощью libGLEW.a

Сокращенная версия моего CMakeLists.txt выглядит следующим образом:

cmake_minimum_required (VERSION 3.5 FATAL_ERROR)
project (TestProject CXX)

set(CMAKE_CXX_FLAGS "-std=c++11")

###########################
# GLEW
###########################
add_subdirectory(${CMAKE_SOURCE_DIR}/Dependencies/GLEW)
target_link_libraries(${PROJECT_NAME} glew)

и в Dependencies/GLEW у меня есть еще CMakeLists.txt:

# Add glew source and header files  
file(GLOB_RECURSE glew-lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/*)  
file(GLOB_RECURSE glew-headers ${CMAKE_CURRENT_SOURCE_DIR}/include/GL/*)

add_library(glew ${glew-lib} ${glew-headers})  
target_include_directories(glew PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include/GL")

Я положил копиюФайл libGLEW.a помещается в каталог lib, а каталог include копируется из каталога include исходного кода glew.Он содержит каталог GL, который содержит заголовочные файлы glew.h, wglew.h, eglew.h и glxew.h.

Когда я запускаю cmake, я получаю ошибку:

CMake Error: Cannot determine link language for target "glew".  
CMake Error: CMake can not determine linker language for target: glew

Исходный код glew также имеет каталог src с glew.c в нем, но если я положу его в каталог libs и включу его в Dependencies/GLEW/CMakeLists.txt, например:

# Add glew source and header files  
file(GLOB_RECURSE glew-lib ${CMAKE_CURRENT_SOURCE_DIR}/lib/*.c)
file(GLOB_RECURSE glew-headers ${CMAKE_CURRENT_SOURCE_DIR}/include/GL/*)
add_library(glew ${glew-lib} ${glew-headers})
target_include_directories(glew PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")

Я получаю сообщение об ошибке:

CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.  
Missing variable is: CMAKE_C_COMPILE_OBJECT  
CMake Error: Error required internal CMake variable not set, cmake may
be not be built correctly.  
Missing variable is: CMAKE_C_CREATE_STATIC_LIBRARY

Наконец, я попытался просто включить glew.c и заголовки в корень CMakeLists.txt, например:

#########################
# GLEW  
#########################
include_directories("${CMAKE_SOURCE_DIR}/Dependencies/GLEW/lib/")
include_directories("${CMAKE_SOURCE_DIR}/Dependencies/GLEW/include/GL/")

На этом cmake закончится, но не сможет скомпилироваться, сказав, что классы не называют тип и / или не объявлены в этой области.

Любая помощь приветствуется.У меня сложилось впечатление, что libGLEW.a - это статическая библиотека, и все, что мне нужно сделать, это связать и скомпилировать ее вместе с заголовками, но это не сработало.

1 Ответ

0 голосов
/ 26 сентября 2018

Прежде всего, я забыл использовать

make install

после первого использования make, поэтому я использовал неправильный файл libGLEW.a.

После включения правильного libGLEW.файла, моя структура каталогов имела

. / Dependencies / GLEW / include / GL / *. h // заголовочные файлы ./Dependencies/GLEW/lib/libGLEW.a // исходный файл

Наконец, TopLevel CMakeLists.txt изменен и включает:

add_library(glew STATIC IMPORTED GLOBAL)

set_target_properties(glew PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/Dependencies/GLEW/lib/libGLEW.a )
set_target_properties(glew PROPERTIES INCLUDE_DIRECTORIES ${CMAKE_SOURCE_DIR}/Dependencies/GLEW/include )

Если я хочу включить библиотеку из более низкого CMakeLists.txt, например / Dependencies / GLEW / CMakeLists.txt Тогда мне нужно было бы сначала экспортировать библиотеку оттуда, а затем импортировать ее в файл topLevel CMakeLists.txt.

Теперь, чтобы использовать заголовки glew в моем проекте, я могу просто использовать #include.

...