Флаги cmake для opengl с использованием glew и glfw

У меня есть этот простой код:

#include <stdio.h>
#include <stdlib.h>

#include <GL/glew.h>
#include <GL/glfw.h>

int main(int argc, char const* argv[] )
{
    if( !glfwInit() ){
        fprintf( stderr, "failed\n" );
    }

    return 0;
}

и в моем CmakeLists.txt:

PROJECT(test C)
find_package(OpenGL)
ADD_DEFINITIONS(
    -std=c99
    -lGL
    -lGLU
    -lGLEW
    -lglfw
)
SET(SRC test)
ADD_EXECUTABLE(test ${SRC})

работает "cmake". не выдает никаких ошибок, но запуск make говорит:

test.c:(.text+0x10): undefined reference to `glfwInit'
collect2: ld returned 1 exit status
make[2]: *** [tut1] Error 1

во время бега:

gcc -o test test.c -std=c99 -lGL -lGLU -lGLEW -lglfw

успешно компилирует код без ошибок. Как заставить cmake работать с моим кодом?

также, если я добавлю эти строки в основную функцию:

glfwOpenWindowHint( GLFW_FSAA_SAMPLES, 4 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MAJOR, 3 );
glfwOpenWindowHint( GLFW_OPENGL_VERSION_MINOR, 1 );
glfwOpenWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );

даже запуск gcc с теми же флагами приведет к ошибке:

test.c: In function ‘main’:
test.c:14: error: ‘GLFW_OPENGL_VERSION_MAJOR’ undeclared (first use in this function)
test.c:14: error: (Each undeclared identifier is reported only once
test.c:14: error: for each function it appears in.)
test.c:15: error: ‘GLFW_OPENGL_VERSION_MINOR’ undeclared (first use in this function)
test.c:16: error: ‘GLFW_OPENGL_PROFILE’ undeclared (first use in this function)
test.c:16: error: ‘GLFW_OPENGL_CORE_PROFILE’ undeclared (first use in this function)

Я использую Linux Mint на основе kubuntu 10.04, cmake v2.8, libglfw-dev, libglfw2, libglew1.5, libglew1.5-dev, glew-utils.

Я новичок в cmake, glew и glfw. Спасибо за помощь ребята!

ваше здоровье!

P


person pixelblender    schedule 31.07.2011    source источник


Ответы (3)


здесь вы можете увидеть пример того, как я использую cmake с glfw. http://code.google.com/p/assembly3d/source/browse/tools/viewer/CMakeLists.txt

Я использую FindGLFW.cmake для поиска glfw http://code.google.com/p/assembly3d/source/browse/tools/viewer/cmake_modules/FindGLFW.cmake

Кроме того, версия glfw в Ubuntu — 2.6. GLFW_OPENGL_VERSION_MINOR и GLFW_OPENGL_VERSION_MAJOR работают только в glfw 2.7, и я думаю, что OpenGL 3.x работает только с glfw 2.7.

Лучший

person ptrv    schedule 06.08.2011

Чтобы увидеть, какие команды выполняет созданный CMake make-файл, запустите make as:

make VERBOSE=1

Просмотр команд очень полезен при отладке проектов CMake. Для представленного примера выполняются следующие команды:

/usr/bin/gcc -std=c99 -lGL -lGLU -lGLEW -lglfw -o CMakeFiles/test.dir/test.c.o -c test.c
/usr/bin/gcc CMakeFiles/test.dir/test.o -o test -rdynamic

Makefiles, сгенерированные CMake, компилируют каждый исходный файл в объектный файл (это то, что делает gcc -c) по отдельности, а затем связывают все объектные файлы вместе с помощью отдельной команды. В приведенном примере библиотеки, связанные с OpenGL, указываются на этапе компиляции, а не на этапе компоновки. Вместо указания библиотек с помощью add_definitions следует использовать команду target_link_libraries.

Такой файл CMakeLists.txt должен работать:

cmake_minimum_required(VERSION 2.8)
project(test C)
add_definitions(-std=c99)
set(SRC test.c)
add_executable(test ${SRC})
target_link_libraries(test GL GLU GLEW glfw)

Префикс -l не нужно указывать для библиотек, поскольку target_link_libraries автоматически добавит префикс -l для сред UNIX/Linux и Расширение .lib для сред Windows. Дополнительную информацию о target_link_libraries можно найти по адресу http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command%3atarget_link_libraries

person dgraves    schedule 05.08.2011

Pixar уже сделал это. Ниже приведен его исходный код, вы можете сослаться на него: https://github.com/PixarAnimationStudios/OpenSubdiv/blob/master/cmake/FindGLFW.cmake

person micfan    schedule 14.10.2015