2015-04-05 10 views
7

Ich folge this tutorial. I cmake'd und make/make install'dglfw und glew perfekt (soweit ich weiß). Allerdings, wenn ich versuche, den Beispielcode zu kompilieren ...Undefinierte Referenzen Kompilieren von OpenGL/glfw/glew unter Ubuntu (g ++)

#define GLEW_STATIC 
#include <GL/glew.h> 
#include <GLFW/glfw3.h> 

int main() 
{ 
    glfwInit(); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    return 0; 
} 

... seinen Linker-Flags mit ...

-lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi 

... Ich erhalte die folgenden Fehler:

/usr/bin/ld: /usr/local/lib/libglfw3.a(x11_init.c.o): undefined reference to symbol 'XF86VidModeQueryExtension' 
/usr/lib/x86_64-linux-gnu/libXxf86vm.so.1: error adding symbols: DSO missing from command line 

Ich Google wurde den Fehler und jemand schlug vor, -lXxf86vm hinzuzufügen. Es wurde von den anfänglichen Fehlern zu befreien, aber hinzugefügt eine erhebliche Zahl mehr:

/usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions': 
x11_init.c:(.text+0x1b93): undefined reference to `XineramaQueryExtension' 
x11_init.c:(.text+0x1bad): undefined reference to `XineramaIsActive' 
/usr/local/lib/libglfw3.a(x11_init.c.o): In function `_glfwCreateCursor': 
x11_init.c:(.text+0x22ee): undefined reference to `XcursorImageCreate' 
x11_init.c:(.text+0x23c5): undefined reference to `XcursorImageLoadCursor' 
x11_init.c:(.text+0x23d5): undefined reference to `XcursorImageDestroy' 
/usr/local/lib/libglfw3.a(x11_monitor.c.o): In function `_glfwPlatformGetMonitors': 
x11_monitor.c:(.text+0x743): undefined reference to `XineramaQueryScreens' 

Wie kann ich herausfinden, was Flagge ich brauche? Wenn es darauf ankommt, ist mein Makefile strukturiert:

CC = g++ 
COMPILER_FLAGS = -std=c++11 
FILES = *.cpp 
LINKER_FLAGS = -lGLEW -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -lXxf86vm 
OBJS = *.o 
LINUX_BIN = HelloWindow 

#Compile(output into error.txt if there is an error), link, then run 
linux: 
    $(CC) $(COMPILER_FLAGS) -c $(FILES) 2> "errors.txt" 
    $(CC) $(COMPILER_FLAGS) $(OBJS) -o $(LINUX_BIN) $(LINKER_FLAGS) 
    ./$(LINUX_BIN)   

Danke!

+4

Für GLFW, müssen Sie wahrscheinlich '-lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm' – derhass

+1

Woher weißt du, was Linker-Flags zu verwenden ? – MrSnappingTurtle

+1

Durch das Betrachten der ungelösten Symbole ... – derhass

Antwort

25

Der Hass hatte Recht. Im Folgenden sind die Fahnen I verwendet:

-lGLEW -lglfw3 -lGL -lX11 -lXi -lXrandr -lXxf86vm -lXinerama -lXcursor -lrt -lm -pthread 
+1

Ich konnte diese Antwort auch verwenden, wenn ich arbeite GLFW v2 zum Kompilieren und Verknüpfen als statisches Objekt. –

+4

Ich musste auch das '-ldl'-Flag auf Ubuntu hinzufügen und konnte die Flags' -lrt' und '-lm' entfernen. Ich denke, es kommt darauf an, welche Kombination von Paketen/wie sie installiert sind, aber diese Liste ist alles inklusive, was großartig ist. –