2013-05-12 16 views
7

ich zu verbinden versuchen, das folgende Testprogramm zu kompilieren:Kann nicht bekommen GLFW

#include <GL/glfw.h> 

int main(int argc, char** argv) { 
    if(!glfwInit()) { 
     return -1; 
    } 

    if(!glfwOpenWindow(640, 480, 8, 8, 8, 0, 24, 0, GLFW_WINDOW)) { 
     return -1; 
    } 

    while(glfwGetWindowParam(GLFW_OPENED)) { 
     glfwSwapBuffers(); 
    } 

    return 0; 
} 

aber ich bekomme immer undefined reference Fehler in Bezug auf die GLFW Funktionen.

Unten ist mein Make-Datei:

CXX = clang++ 
CXXFLAGS = -Wall -std=c++0x 
LDFLAGS = -lglfw 

OBJ_DIR = bin 
LIB_DIR = -L/usr/lib 
INC_DIR = -I/usr/include 

SOURCE = main.cpp 
OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o} 
EXECUTABLE = hello 

all: init $(OBJECTS) $(EXECUTABLE) 

$(EXECUTABLE): 
    $(CXX) $(CXXFLAGS) $(LDFLAGS) $(LIB_DIR) -o [email protected] $(OBJECTS) 

$(OBJ_DIR)/%.o: %.cpp 
    $(CXX) $(INC_DIR) -c $< -o [email protected] 

init: 
    @mkdir -p "$(OBJ_DIR)" 

clean: 
    @rm -rf $(OBJ_DIR) $(EXECUTABLE) 

ich auf jeden Fall glfw.h und libglfw.a/.so wie, wenn ich locate glfw laufen erhalte ich:

:~$ locate glfw 
/usr/include/GL/glfw.h 
/usr/lib/libglfw.a 
/usr/lib/libglfw.so 
/usr/lib/libglfw.so.2 
/usr/lib/libglfw.so.2.6 

Die Ausgabe von nm /usr/lib/libglfw.a | grep glfwInit:

:~$ nm /usr/lib/libglfw.a | grep glfwInit 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitialized 
0000000000000000 B _glfwInitialized 
0000000000000000 T glfwInit 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitialized 
       U _glfwInitJoysticks 
       U _glfwInitTimer 
00000000000000c0 T _glfwInitJoysticks 
0000000000000000 T _glfwInitTimer 

und die ausführliche Nachricht von clang:

clang++ -I/usr/include -c main.cpp -o bin/main.o 
clang++ -Wall -std=c++0x -Wl --verbose -lglfw -lGL -lGLU -L/usr/lib -o hello bin/main.o 
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0) 
Target: x86_64-pc-linux-gnu 
Thread model: posix 
clang: warning: argument unused during compilation: '-std=c++0x' 
"/usr/bin/ld" -z relro --hash-style=gnu --as-needed --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o hello /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6/crtbegin.o -L/usr/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6/../../.. -L/lib/x86_64-linux-gnu -L/lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib -lglfw -lGL -lGLU bin/main.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.6/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crtn.o 
bin/main.o: In function `main': 
main.cpp:(.text+0x17): undefined reference to `glfwInit' 
main.cpp:(.text+0x76): undefined reference to `glfwOpenWindow' 
main.cpp:(.text+0x97): undefined reference to `glfwGetWindowParam' 
main.cpp:(.text+0xa7): undefined reference to `glfwSwapBuffers' 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [hello] Error 1 

Es scheint nicht die Bibliothek zu finden?

+0

hinzufügen '-Wl, - Ausführlich "zu" LDFLAGS "und sehen, ob die richtige Bibliothek gefunden wird. Führen Sie außerdem 'nm' in der Bibliotheksdatei aus, um sicherzustellen, dass die undefinierten Referenzen wirklich in der Bibliotheksdatei enthalten sind. –

+0

Ich habe meinen Beitrag mit der Ausgabe der Nachrichten aktualisiert. Es scheint nicht die Bibliotheken zu finden? – Lerp

Antwort

11

Das Problem ist, dass die GLFW Bibliotheken vor der Objektdatei an den Linker angegeben werden, die von ihnen abhängt. ld Durchsucht Bibliotheken, um Abhängigkeiten nur für die Abhängigkeiten aufzulösen, von denen sie an dem Punkt in der Liste der Dateien weiß, die sie verarbeitet. Also, wenn ldlibglfw.a suchen, weiß es nicht über die glfwInit Abhängigkeit in main.o noch. ld (standardmäßig) wird die Bibliothek nicht erneut durchsucht.

Versuchen:

$(EXECUTABLE): 
    $(CXX) $(CXXFLAGS) $(LIB_DIR) -o [email protected] $(OBJECTS) $(LDFLAGS) 

Auch die Bibliotheken wahrscheinlich in einem LDLIBS (oder LIBS) Variable angegeben werden sollte - LDFLAGS ist konventionell Verwendung für Linker-Optionen:

CXX = clang++ 
CXXFLAGS = -Wall -std=c++0x 
LDLIBS = -lglfw -lGL -lGLU 

OBJ_DIR = bin 
LIB_DIR = -L/usr/lib 
INC_DIR = -I/usr/include 

SOURCE = main.cpp 
OBJECTS = ${SOURCE:%.cpp=$(OBJ_DIR)/%.o} 
EXECUTABLE = hello 

all: init $(OBJECTS) $(EXECUTABLE) 

$(EXECUTABLE): 
    $(CXX) $(LDFLAGS) $(LIB_DIR) -o [email protected] $(OBJECTS) $(LDLIBS) 

$(OBJ_DIR)/%.o: %.cpp 
    $(CXX) $(INC_DIR) -c $< -o [email protected] 

init: 
    @mkdir -p "$(OBJ_DIR)" 

clean: 
    @rm -rf $(OBJ_DIR) $(EXECUTABLE) 
+0

Perfekt! Vielen Dank. – Lerp