2013-05-12 7 views
7

मैं नीचे परीक्षण कार्यक्रम को संकलित करने के कोशिश कर रहा हूँ प्राप्त नहीं कर सकता: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; 
} 

लेकिन मैं हमेशा GLFW कार्यों के संबंध में undefined reference त्रुटियों मिलता है। जब मैं locate glfw चलाने मैं

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) 

मैं निश्चित रूप से है glfw.h और libglfw.a/.so के रूप में:

:~$ 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 

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 

और

नीचे मेरी makefile है क्लैंग से वर्बोज़ संदेश:

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 

ऐसा लगता है कि पुस्तकालय नहीं ढूंढ रहा है?

+0

जोड़े '-Wl, - वर्बोज़ 'से' एलडीएफएलजीएस 'और देखें कि सही लाइब्रेरी मिल रही है या नहीं। साथ ही, लाइब्रेरी फ़ाइल पर 'एनएम' चलाएं ताकि यह सुनिश्चित किया जा सके कि अनिर्धारित संदर्भ वास्तव में लाइब्रेरी फ़ाइल में हैं। –

+0

मैंने संदेशों के आउटपुट के साथ अपनी पोस्ट अपडेट की है। ऐसा लगता है कि पुस्तकालयों को नहीं ढूंढ रहा है? – Lerp

उत्तर

11

समस्या यह है कि ग्लोबल पुस्तकालयों को ऑब्जेक्ट फ़ाइल से पहले लिंकर को निर्दिष्ट किया जा रहा है जो उन पर निर्भर करता है। ld केवल निर्भरताओं के लिए निर्भरताओं को हल करने के लिए पुस्तकालयों की खोज करता है जो इसे संसाधित करने वाली फ़ाइलों की सूची में बिंदु के बारे में जानता है। तो जब ldlibglfw.a खोज रहा है तो यह glfwInit निर्भरता के बारे में main.o में अभी तक नहीं जानता है। ld (डिफ़ॉल्ट रूप से) लाइब्रेरी को फिर से खोज नहीं करता है।

प्रयास करें: -

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

भी पुस्तकालयों शायद एक LDLIBS (या LIBS) चर में निर्दिष्ट किया जाना चाहिए LDFLAGS लिंकर विकल्प के लिए पारंपरिक इस्तेमाल होता है:

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

बिल्कुल सही! आपका बहुत बहुत धन्यवाद। – Lerp

संबंधित मुद्दे