2012-04-03 24 views
5

Tôi đã viết một chương trình trên Ubuntu 11.04 sử dụng freeglut. Nó hoạt động tốt. Sau đó, tôi có một máy tính khác và cố gắng chạy chương trình trên một bản cài đặt mới của Ubuntu 11.04. Không hoạt động. Vì vậy, tôi cài đặtOpengl linux undefined tham chiếu đến các chức năng cơ bản

sudo apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu 1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev mesa-chung-dev gcc

và cố gắng để chạy chương trình, trong đó nhập khẩu



    #include <GL/freeglut.h> 
    #include <GL/gl.h> 
    #include <GL/glu.h> 

sử dụng lệnh

g++ -lGL -lGLU -lglut Driver.cpp -o a

Tuy nhiên mối liên kết hoặc bất cứ điều gì spits ra như 200 lỗi có dạng:



    Driver.cpp:(.text+0x3c6b): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3c75): undefined reference to `glEnable' 
    Driver.cpp:(.text+0x3c9a): undefined reference to `glColor4f' 
    Driver.cpp:(.text+0x3cb5): undefined reference to `glRotatef' 
    Driver.cpp:(.text+0x3d02): undefined reference to `glutSolidSphere' 
    Driver.cpp:(.text+0x3d07): undefined reference to `glutSwapBuffers' 

Nguyên nhân của sự cố là gì?

+1

Tại sao tệp nguồn của bạn có tên .cpp nếu bạn biên dịch bằng gcc? Nếu nó là C++, bạn phải biên dịch với g ++, nếu nó là C, nó phải được gọi là something.c. – lvella

+0

Typo trong bài đăng. Tôi đang sử dụng g ++ –

+0

Driver.cpp này là gì? Bạn có bao gồm nó từ program.cpp? – lvella

Trả lời

15

Thứ tự mà bạn chỉ định các đối tượng bạn muốn liên kết đến (bao gồm thư viện tĩnh và động) có thể quan trọng.

Hãy thử với:

g++ Driver.cpp -lGL -lGLU -lglut -o a 

(. Không chắc về thứ tự của các libs, nhưng trông ok)

Ý tưởng khi bạn xây dựng dòng lệnh của bạn là nếu a đòi hỏi một biểu tượng từ b, b phải xuất hiện saua trong dòng lệnh.

Vấn đề thứ tự liên kết xảy ra (hoặc không) với GCC/ld đối với thư viện được chia sẻ tùy thuộc vào (rất có thể trong số những thứ khác - tôi không có chuyên gia ở đây) cho dù cờ liên kết --as-needed có được đặt hay không. (Xem ví dụ mục trước trong hướng dẫn chuyển đổi as-needed của Gentoo.)
Quá trình liên kết loại bỏ các ký hiệu không cần thiết càng sớm càng tốt khi --as-needed hoạt động, gây ra sự cố nếu thứ tự liên kết không "đúng". Điều này được thực hiện để giảm số lượng phụ thuộc không cần thiết hiện diện trong các tập tin thực thi cuối cùng.
Điều này không xảy ra (hoặc ít hơn) nếu --as-needed không hoạt động - tất cả các ký hiệu được giữ trong trường hợp đó và thứ tự liên kết không quan trọng nhiều (nhiều hơn hoặc ít hơn - một lần nữa, tôi không có chuyên gia.)

Vì các bản phân phối khác nhau sử dụng các giá trị mặc định khác nhau cho lá cờ đó, hành vi của GCC có vẻ không nhất quán, nhưng đó chỉ là một ấn tượng.

+0

Đó thường là một vấn đề với các thư viện liên kết tĩnh. Tôi không biết những gì có thể đã gây ra vấn đề với các thư viện được chia sẻ, đó là trường hợp. – lvella

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