我有这个简单的代码:
#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)
我正在运行基于kubuntu 10.04,cmake v2.8,libglfw-dev,libglfw2,libglew1.5,libglew1.5-dev,glew-utils的linux mint。
我是cmake,glew和glfw的新手。谢谢你的帮助!
喝彩!
P
答案 0 :(得分:4)
你可以在这里看到一个例子我如何使用glfw的cmake。 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
另外,ubuntu中的glfw版本是2.6。 GLFW_OPENGL_VERSION_MINOR和GLFW_OPENGL_VERSION_MAJOR只适用于glfw 2.7,我认为OpenGL 3.x仅适用于glfw 2.7。
最佳
答案 1 :(得分:3)
要查看CMake生成的makefile正在执行的命令,请运行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
CMake生成的makefile会将每个源文件分别编译成一个目标文件(这就是 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 </ em>前缀,因为 target_link_libraries 会自动为UNIX / Linux添加 -l </ em>前缀环境和Windows环境的 .lib 扩展。有关 target_link_libraries 的更多信息,请访问http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:target_link_libraries
答案 2 :(得分:0)
皮克斯已经做到了。以下是其源代码,您可以参考: https://github.com/PixarAnimationStudios/OpenSubdiv/blob/master/cmake/FindGLFW.cmake