2011-07-31 46 views
6

tôi có mã đơn giản này:cờ cmake cho OpenGL sử dụng glew và 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; 
} 

và trong CmakeLists.txt tôi:

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

chạy "cmake." không tạo ra bất kỳ lỗi, nhưng chạy chắc sẽ nói:

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

khi chạy:

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

biên dịch thành công mã không có lỗi. Làm thế nào để tôi làm cho cmake chạy với mã của tôi?

cũng có, nếu tôi thêm những dòng này để các chức năng chính:

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

thậm chí chạy gcc với những lá cờ cùng sẽ tạo ra lỗi:

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) 

tôi đang chạy bạc hà linux dựa trên kubuntu 10.04, cmake v2.8, libglfw-dev, libglfw2, libglew1.5, libglew1.5-dev, glew-utils.

Tôi mới tham gia cmake, glew và glfw. Cảm ơn sự giúp đỡ của các bạn!

cổ vũ!

P

Trả lời

3

Để xem các lệnh rằng CMake tạo makefile đang thực hiện, chạy làm như:

make VERBOSE=1 

Thấy các lệnh rất hữu ích khi gỡ lỗi dự án CMake. Đối với ví dụ được cung cấp, các lệnh sau đây được thực hiện:

/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 

Các makefiles tạo ra bởi CMake sẽ biên dịch mỗi file nguồn vào một tập tin đối tượng (đây là những gì gcc -c không) cá nhân, và sau đó liên kết tất cả các các tệp đối tượng cùng với một lệnh riêng biệt. Với ví dụ được cung cấp, các thư viện liên quan đến OpenGL đang được chỉ định trong giai đoạn biên dịch chứ không phải trong giai đoạn liên kết. Thay vì chỉ định các thư viện với add_definitions, cần sử dụng lệnh target_link_libraries.

tập tin

Một CMakeLists.txt như thế này nên làm việc:

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) 

Các -l tiền tố không cần phải được chỉ định cho các thư viện vì target_link_libraries sẽ tự động thêm tiền tố -l cho Môi trường UNIX/Linux và phần mở rộng .lib cho môi trường Windows. Bạn có thể tìm thêm thông tin về target_link_libraries tại http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:target_link_libraries

+0

cảm ơn lời giải thích. sẽ cung cấp cho nó một thử – pixelblender

4

bạn có thể xem ở đây ví dụ về cách sử dụng cmake với glfw. http://code.google.com/p/assembly3d/source/browse/tools/viewer/CMakeLists.txt

tôi sử dụng cho việc tìm kiếm FindGLFW.cmake glfw http://code.google.com/p/assembly3d/source/browse/tools/viewer/cmake_modules/FindGLFW.cmake

Ngoài ra, phiên bản glfw trong ubuntu là 2,6. GLFW_OPENGL_VERSION_MINOR và GLFW_OPENGL_VERSION_MAJOR chỉ hoạt động ở độ phân giải 2.7 và tôi nghĩ OpenGL 3.x chỉ hoạt động với độ phân giải 2.7.

Tốt nhất

+0

cảm ơn cho các liên kết. chúc mừng! – pixelblender

Các vấn đề liên quan