2016-02-26 71 views
0

我已经尝试过几次在几种平台上用C和C++编写OpenGL程序,每次只能被可笑地出现的荒谬依赖和链接问题所阻止。GLFW未定义很多东西的参考

我试图在Linux系统上使用GLFW和C++,使用CMake构建,但绝对没有成功。

的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 

project(GL_TEST_PROJECT) 

find_package(OpenGL REQUIRED) 
if(NOT OPENGL_FOUND) 
    message("ERROR: OpenGL not found") 
endif(NOT OPENGL_FOUND) 

set(GL_LIBRARY GL GLU X11) 

add_executable(testgl testgl.cpp) 

target_link_libraries(testgl glfw3 Xxf86vm pthread dl Xi Xcursor Xrandr X11 ${GL_LIBRARY} m) 

testgl.cpp:

#include <GLFW/glfw3.h> 
#include <stdlib.h> 
#include <stdio.h> 
static void error_callback(int error, const char* description) 
{ 
    fputs(description, stderr); 
} 
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) 
{ 
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 
     glfwSetWindowShouldClose(window, GL_TRUE); 
} 
int main(void) 
{ 
    GLFWwindow* window; 
    glfwSetErrorCallback(error_callback); 
    if (!glfwInit()) 
     exit(EXIT_FAILURE); 
    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     exit(EXIT_FAILURE); 
    } 
    glfwMakeContextCurrent(window); 
    glfwSetKeyCallback(window, key_callback); 
    while (!glfwWindowShouldClose(window)) 
    { 
     float ratio; 
     int width, height; 
     glfwGetFramebufferSize(window, &width, &height); 
     ratio = width/(float) height; 
     glViewport(0, 0, width, height); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f); 
     glBegin(GL_TRIANGLES); 
     glColor3f(1.f, 0.f, 0.f); 
     glVertex3f(-0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 1.f, 0.f); 
     glVertex3f(0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 0.f, 1.f); 
     glVertex3f(0.f, 0.6f, 0.f); 
     glEnd(); 
     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 
    glfwDestroyWindow(window); 
    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 

make输出:

Linking CXX executable testgl 
//usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions': 
x11_init.c:(.text+0x1b8b): undefined reference to `XineramaQueryExtension' 
x11_init.c:(.text+0x1ba3): undefined reference to `XineramaIsActive' 
//usr/local/lib/libglfw3.a(x11_monitor.c.o): In function `_glfwPlatformGetMonitors': 
x11_monitor.c:(.text+0x672): undefined reference to `XineramaQueryScreens' 
collect2: error: ld returned 1 exit status 
make[2]: *** [testgl] Error 1 
make[1]: *** [CMakeFiles/testgl.dir/all] Error 2 
make: *** [all] Error 2 

我已经对CMakeLists.txt文件尝试了几个不同的更改,包括删除和添加不同的依赖项,但似乎无处可去。我需要做什么才能让这个程序编译?

回答

0

一下添加到 “target_link_libraries()”:

glfw ${GLFW_LIBRARIES} ${X11_LIBRARIES} 

,然后添加在上面你的CMakeLists.txt文件 “include_directories” 这个地方:

######################################################### 
# FIND X11 
######################################################### 
find_package(X11 REQUIRED) 
include_directories(${X11_INCLUDE_DIRS}) 
link_directories(${X11_LIBRARY_DIRS}) 
add_definitions(${X11_DEFINITIONS}) 
if(NOT X11_FOUND) 
    message(ERROR " X11 not found!") 
endif(NOT X11_FOUND) 

编辑#2:然后尝试在以下为您的CMakeLists.txt

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglfw3 -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor -lGL -lpthread") 
+0

这似乎并没有解决这个问题......我仍然得到同样的输出。 –

+0

尝试增加集(CMAKE_CXX_FLAGS “$ {} CMAKE_CXX_FLAGS -lglfw3 -lGL -lX11 -lXi -lXinerama -lXcursor”)之前 “add_executable” –

+0

这也使得在输出中没有区别你的CMakeLists.txt文件。 –

0

使用

set(CMAKE_CXX_FLAGS ...) 

不为我工作,但如果把它们变成

set(GLFW_DEPS X11 Xrandr Xinerama Xxf86vm Xcursor GL dl pthread) 

是否把事情的工作。

所以,我target_link_libraries看起来像这样

target_link_libraries(${PROJECT_NAME} glfw3 ${GLFW_DEPS} ${GLEW_STATIC_LIBRARY}) 

这可能是我没有正确地使用CMAKE_CXX_FLAGS,但你应该尝试只需添加库你的自我。请小心,它们的顺序很重要,取决于您使用的GLFW版本,它们可能会有所不同。

你得到的错误严格是因为你错过了Xinerama库。

有两种方法可以不用手动添加这些库:

选项1是使用GLFW_LIBRARIES,你必须包括GLFW源到您的项目在这里说build with Cmake and GLFW source

选项2将使用find_package的帮助,如下所述:Build with installed GLFW binaries

看起来好像您的机器上安装了glfw,所以我会推荐选项2,部分原因是我还没有获得选项1的工作,而我目前不得不手动进入图书馆。这是因为我不希望在机器上安装glfw,并将它全部包含在项目中。