Как собрать GLEW как часть проекта CMake

Я делаю проект cmake, который использует GLEW. Я хочу построить GLEW на лету (а не просто связать с скомпилированной библиотекой). Я использую add_subdirectory для добавления сторонних библиотек в свой проект. Вот как сейчас выглядит мой файл CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (quokka)

#configure_file (
#  "${CMAKE_CURRENT_SOURCE_DIR}/TutorialConfig.h.in"
#  "${CMAKE_CURRENT_SOURCE_DIR}/TutorialConfig.h"
#  )

include_directories(${CMAKE_SOURCE_DIR}/../3rd_party/glew/include)
include_directories(${CMAKE_SOURCE_DIR}/../3rd_party/glfw/include)
include_directories(${CMAKE_SOURCE_DIR}/../3rd_party/freetype-2.6.2/include)
include_directories(${CMAKE_SOURCE_DIR})

set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/../../temp)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -Wall -std=c++11")

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(OUTPUT_LIB_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/../../temp/Debug)
endif ()

if(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(OUTPUT_LIB_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/../../temp/Release)
endif ()

set(GLFW ${OUTPUT_LIB_DIRECTORIES}/glfw)
set(FREETYPE ${OUTPUT_LIB_DIRECTORIES}/freetype)
set(GLEW ${OUTPUT_LIB_DIRECTORIES}/glew)

add_subdirectory(${CMAKE_SOURCE_DIR}/../3rd_party/glfw/ ${CMAKE_CURRENT_SOURCE_DIR}/../../temp/lib/glfw) 
add_subdirectory(${CMAKE_SOURCE_DIR}/../3rd_party/glew/build/cmake ${CMAKE_CURRENT_SOURCE_DIR}/../../temp/lib/glew) 
add_subdirectory(${CMAKE_SOURCE_DIR}/../3rd_party/freetype-2.6.2/ ${CMAKE_CURRENT_SOURCE_DIR}/../../temp/lib/freetype) 
add_subdirectory(Input)
add_subdirectory(Process)
add_subdirectory(Application)
add_subdirectory(View)
add_subdirectory(GameLogic)
add_subdirectory(UID)
add_subdirectory(Actor)
add_subdirectory(AssetManager)
add_subdirectory(GUI)
add_subdirectory(GraphicsEngine)

add_executable(quokka main.cpp)

target_link_libraries(quokka Input ProcessLibrary Application View GameLogic UID Actor AssetManager GUI GraphicsEngine)

target_link_libraries(quokka glfw freetype)

if (UNIX)
   target_link_libraries(quokka glew Xrandr Xinerama Xi Xcursor X11 Xxf86vm pthread GL)
endif (UNIX)

if (WIN32)
   target_link_libraries(quokka glew32 opengl32)
endif (WIN32)

Как видите, я указываю выходной каталог ($ {CMAKE_CURRENT_SOURCE_DIR} /../../ temp / lib / glfw) для сторонних библиотек, и он хорошо работает для GLFW и freetype, но GLEW заканчивается где-то еще. Итак, я создаю проекты Visual Studio с этой настройкой, и по какой-то причине выходной каталог для GLEW равен C:\_work\quokka_plus\temp\VSProjects\bin\Debug\. В результате, когда я создаю свой проект, он не может найти файл glew32.lib. Почему CMake для GLEW действует иначе, чем для GLFW и freetype, и как заставить его разместить скомпилированную библиотеку в нужном мне месте, не касаясь источников GLEW CMake?


person Kirill Daybov    schedule 13.12.2016    source источник
comment
Why does CMake act differently for GLEW than it does for GLFW and freetype - Возможно, сам проект GLEW изменяет переменную LIBRARY_OUTPUT_PATH или около того. Внешняя модификация такой переменной - это не то, к чему нужно готовиться каждый проект. how to make it place compiled lib in a place I need without touching CMake sources of GLEW? - Как правило, вы не можете заставить сторонний проект строить объекты в определенном месте. Но с установкой дело обстоит иначе: большинство проектов следуют некоторым обычным соглашениям при установке библиотек и так далее.   -  person Tsyvarev    schedule 13.12.2016
comment
@Tsyvarev, посоветуете ли вы мне создавать и устанавливать сторонние библиотеки отдельно от моего проекта, а не собирать их как часть моего проекта?   -  person Kirill Daybov    schedule 01.01.2017
comment
Вы можете создавать и устанавливать сторонние библиотеки при настройке проекта (с помощью команды execute_process).   -  person Tsyvarev    schedule 09.01.2017


Ответы (1)


Чтобы собрать исходный код GLEW с помощью cmake. Вы можете создать папку в папке проекта cmake с именем ./external и поместить в нее код GLEW.

Для получения дополнительных сведений см. Учебные пособия на сайте http://www.opengl-tutorial.org/.

и исполняемый исходный код проекта: http://www.opengl-tutorial.org/download/

add_subdirectory (external)

include_directories(
    external/AntTweakBar-1.16/include/
    external/glfw-3.1.2/include/
    external/glm-0.9.7.1/
    external/glew-1.13.0/include/
    external/assimp-3.0.1270/include/
    external/bullet-2.81-rev2613/src/
    .
)

set(ALL_LIBS
    ${OPENGL_LIBRARY}
    glfw
    GLEW_1130
)

add_definitions(
    -DTW_STATIC
    -DTW_NO_LIB_PRAGMA
    -DTW_NO_DIRECT3D
    -DGLEW_STATIC
)

target_link_libraries(FOO
    ${ALL_LIBS}
)
person cyang    schedule 04.01.2019