Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cmake flags for opengl using glew and glfw

I have this simple code:

#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;
}

and in my CmakeLists.txt:

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

running "cmake ." doesn't produce any error, but running make will says:

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

while running:

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

successfully compiles the code without error. How do i make cmake run with my code?

also, if i add these lines to the main function:

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 );

even running gcc with the same flags will produce error:

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)

i'm running linux mint based on kubuntu 10.04, cmake v2.8, libglfw-dev, libglfw2, libglew1.5, libglew1.5-dev, glew-utils.

I'm new to cmake, glew and glfw. Thanks for your help guys!

cheers!

P

like image 532
pixelblender Avatar asked Jul 31 '11 11:07

pixelblender


2 Answers

you can see here an example how I use cmake with glfw. http://code.google.com/p/assembly3d/source/browse/tools/viewer/CMakeLists.txt

I use FindGLFW.cmake for finding glfw http://code.google.com/p/assembly3d/source/browse/tools/viewer/cmake_modules/FindGLFW.cmake

Also, glfw version in ubuntu is 2.6. GLFW_OPENGL_VERSION_MINOR and GLFW_OPENGL_VERSION_MAJOR just works in glfw 2.7 and I think OpenGL 3.x works only with glfw 2.7.

Best

like image 52
ptrv Avatar answered Oct 19 '22 00:10

ptrv


To see the commands that the CMake generated makefile is executing, run make as:

make VERBOSE=1

Seeing the commands is very helpful when debugging CMake projects. For the example provided, the following commands are executed:

/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

The makefiles generated by CMake will compile each source file into an object file (this is what gcc -c does) individually, and then link all of the object files together with a separate command. With the provided example, the OpenGL related libraries are being specified during the compilation stage, and not during the link stage. Instead of specifying the libraries with add_definitions, the target_link_libraries command should be used.

A CMakeLists.txt file like this should work:

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)

The -l prefix does not need to be specified for the libraries because target_link_libraries will automatically add the -l prefix for UNIX/Linux environments and the .lib extension for Windows environments. More information about target_link_libraries can be found at http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:target_link_libraries

like image 21
dgraves Avatar answered Oct 18 '22 23:10

dgraves