2012-02-26 32 views
9

Tôi có cùng lỗi hơn here. Không có giải pháp ở đó và tôi cũng sẽ cố gắng giải thích rõ ràng hơn để hy vọng ai đó có giải pháp. Ngoài ra tôi đã cài đặt mọi thứ từ câu trả lời cho câu hỏi this.Lỗi Qt: tham chiếu không xác định đối với 'gluOrtho2D'

Tôi đang cố gắng biên dịch một chương trình mà một người bạn đã thực hiện trong QT (linux). Tôi đã thử nó trên Windows và nó chạy tốt, vấn đề là tôi không thể chạy nó trên Ubuntu 11,10.

Đây là sản phẩm biên soạn tại QT:

... 
glwidget.o:glwidget.cpp:function GLWidget::resizeGL(int, int): error: undefined reference to 'gluOrtho2D' 
glwidget.o:glwidget.cpp:function GLWidget::projectScene(): error: undefined reference to 'gluOrtho2D' 
make: Leaving directory... 
collect2: ld returned 1 exit status 
make: *** [QTapplication] Error 1 
... 
  • glu.h và gl.h đượC#included.
  • QT + = OpenGL được đặt ở .pro

Tôi không biết nếu đó là vấn đề của Ubuntu 11.10. Tôi đã đọc rằng nó có một số vấn đề với linker mặc dù tôi đã tải về "binutils-gold" được cho là đã sửa nó. Ngoài ra tôi đã cố gắng để thêm bằng tay thư viện với nhấp chuột phải trên các dự án '.-> Thêm Thư viện, nhưng nó sẽ không cho phép tôi thêm gì tại "/ usr/include/GL".

Cuối cùng, đây là kết quả biên dịch hoàn chỉnh:


make: Entering directory `/home/daniel/Escritorio/Practica3-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release' 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. -o main.o ../Practica3/main.cpp 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. -o mainwindow.o ../Practica3/mainwindow.cpp 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. -o glwidget.o ../Practica3/glwidget.cpp 
../Practica3/glwidget.cpp:120:6: warning: unused parameter 'event' [-Wunused-parameter] 
/home/daniel/QtSDK/Desktop/Qt/4.8.0/gcc/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. ../Practica3/mainwindow.h -o moc_mainwindow.cpp 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. -o moc_mainwindow.o moc_mainwindow.cpp 
/home/daniel/QtSDK/Desktop/Qt/4.8.0/gcc/bin/moc -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. ../Practica3/glwidget.h -o moc_glwidget.cpp 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../../QtSDK/Desktop/Qt/4.8.0/gcc/mkspecs/linux-g++ -I../Practica3 -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtCore -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtGui -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include/QtOpenGL -I../../QtSDK/Desktop/Qt/4.8.0/gcc/include -I../Practica3/SceneObjects -I../Practica3/SceneObjects/Auxiliar -I/usr/X11R6/include -I. -I. -I../Practica3 -I. -o moc_glwidget.o moc_glwidget.cpp 
g++ -Wl,-O1 -Wl,-rpath,/home/daniel/QtSDK/Desktop/Qt/4.8.0/gcc/lib -o Practica3 main.o mainwindow.o glwidget.o scene.o pv2d.o regularpolygon.o obstacle.o sceneobject.o rectangle.o paintableobject.o segment.o point.o pen.o bouncingball.o circle.o moc_mainwindow.o moc_glwidget.o -L/home/daniel/QtSDK/Desktop/Qt/4.8.0/gcc/lib -L/usr/X11R6/lib -lQtOpenGL -lQtGui -lQtCore -lGL -lpthread 
glwidget.o:glwidget.cpp:function GLWidget::resizeGL(int, int): error: undefined reference to 'gluOrtho2D' 
make: Leaving directory `/home/daniel/Escritorio/Practica3-build-desktop-Desktop_Qt_4_8_0_for_GCC__Qt_SDK__Release' 
glwidget.o:glwidget.cpp:function GLWidget::projectScene(): error: undefined reference to 'gluOrtho2D' 
collect2: ld returned 1 exit status 
make: *** [Practica3] Error 1 
16:44:35: The process "/usr/bin/make" exited with code 2. 
Error while building project Practica3 (target: Desktop) 
When executing build step 'Make' 
+0

hay không các tiêu đề được bao gồm là không liên quan ở đây - bạn có một lỗi mối liên kết không phải là một lỗi biên dịch. Để khắc phục nó, bạn cần phải chắc chắn rằng bạn đang liên kết trong thư viện glu một cách chính xác. –

+0

Bạn dường như đang liên kết với gl nhưng không phải glu. Hãy thử thêm -lGLU và xem điều đó có giúp ích gì không. –

+0

có thể trùng lặp của [tham chiếu không xác định đến 'gluOrtho2D '] (http://stackoverflow.com/questions/9326380/undefined-reference-to-gluortho2d) –

Trả lời

9

Bạn cần phải thêm thư viện liên quan đến tùy chọn mối liên kết.

Thư viện được thêm với tùy chọn -l (chữ thường L). Chúng không phải là đường dẫn mà là các tệp thực sự có chứa mã. Trên Linux, các tệp đó có các tiện ích mở rộng là .so*. Trên Windows, những tệp này là .dll tệp. Các tiện ích khác nhau trên các nền tảng khác.

Một trong những câu hỏi mà bạn liên kết các quốc gia mà bạn cần các thư viện sau: (. gluOrtho2D là thực sự trong libGLU, nhưng bạn có thể thiếu những người khác)

-lglut -lGL -lGLU -lGLEW 

đã đọc tài liệu của IDE của bạn để xem làm thế nào bạn có nghĩa vụ phải thêm những người vào các tùy chọn liên kết, nhưng nhiều người cho phép bạn nhập chúng giống như trong khu vực bên phải của các thiết lập dự án.

Nếu các thư viện không nằm trong đường dẫn thư viện thông thường trên máy tính của bạn (/lib, /usr/lib trên Linux, có thể /lib64/usr/lib64, hoặc cùng với 32 thay), bạn sẽ phải nói với các mối liên kết để tìm trong các thư mục khác.
Đối với điều đó, IDE của bạn có một tùy chọn khác cho đường dẫn tìm kiếm trình liên kết hoặc bạn có thể chỉ định chúng trong cùng một vị trí với các thư viện thực tế. Bạn sử dụng công tắc -L cho điều đó.

-L cho đường dẫn tìm kiếm, -l cho thư viện.

Tóm tắt: nếu bạn muốn liên kết với libsuperfoo.so đó là trong /usr/local/bar/libs, sau đó các tùy chọn mối liên kết đúng là:

-L/usr/local/bar/libs -lsuperfoo 

Nếu bạn đang sử dụng qmake, điều duy nhất bạn cần phải thêm vào .pro tập tin là (đối với thư viện giả thuyết trên):

LIBS += -L/usr/local/bar/libs -lsuperfoo 
+0

Cảm ơn câu trả lời! Tôi đã đạt được nó: LIBS + = -lglut -lGL -lGLU -lGLEW tại .pro – arqueum

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