флаги cmake для opengl с использованием glew и glfw - PullRequest
6 голосов
/ 31 июля 2011

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

#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 will сообщает:

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

Ответы [ 3 ]

4 голосов
/ 06 августа 2011

вы можете увидеть здесь пример того, как я использую 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.

Лучший

3 голосов
/ 05 августа 2011

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

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:target_link_libraries

0 голосов
/ 14 октября 2015

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

...