2012-01-24 33 views
7

sau khi nâng cấp lên Ubuntu 11.10, tôi thấy rằng nhiều phát triển cũ và hiện tại của tôi không thể được biên dịch nữa. Tôi đã giảm được vấn đề với một ví dụ đơn giản:Sự cố liên kết trong Ubuntu 11.10

#include <X11/Xlib.h> 

int main() { 
    Display* display = XOpenDisplay(":0.0"); 
    XCloseDisplay(display); 

    return 0; 
} 

Biên soạn nó bằng cách sử:

g++ -lX11 test.cpp 

hoặc

g++ -c -o test.o test.cpp 
g++ -lX11 -o test test.o 

Nguyên nhân thất bại xảy ra:

/tmp/ccBAOpzy.o: In function `main': 
test.cpp:(.text+0x11): undefined reference to `XOpenDisplay' 
test.cpp:(.text+0x21): undefined reference to `XCloseDisplay' 

Bất kỳ ý tưởng? Tôi đã phát hiện ra rằng một số nội dung liên kết đã thay đổi trong 11.10:

https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

Nhưng vẫn không giải thích những vấn đề này.

+0

Bạn đã cài đặt gói dev X11 dev trước đây. – boto

+4

@boto Tôi biết điều đó. Trên thực tế, sự cố nằm trong thứ tự tham số. Ubuntu 11.10 tàu GCC 4.6.1, mà dường như giới thiệu các ràng buộc đặt hàng tham số chặt chẽ hơn. g ++ test.cpp -lX11 hoạt động tốt. – cyberguijarro

+0

Bây giờ chúng ta hãy xem làm thế nào tôi có thể làm cho SCons làm việc xung quanh ... – cyberguijarro

Trả lời

20

g++ -lX11 -o test test.o

Trên lệnh là sai. Hãy thử thay vào đó:

g++ test.o -lX11 

Giải thích lý do tại sao đơn hàng quan trọng here.

Ngoài ra, bạn không bao giờ nên gọi các tệp thi hành test trên UNIX.

+0

Gọi một thực thi 'test' là ok * nếu * (a) bạn không có' .' trong '$ PATH', và (b) bạn gọi nó là'./Test' thay vì 'test'. –

+0

Nhưng nếu nó nhận được trên PATH, kịch bản shell bạn chưa bao giờ nghe nói sẽ bắt đầu bùng nổ xung quanh bạn và máy của bạn sẽ không bao giờ giống nhau nữa. Trên thực tế, hầu hết các shell có một thử nghiệm có tên dựng sẵn và nhiều kịch bản thích sử dụng '[' những ngày này, vì vậy nó có thể là không có gì xảy ra .... có thể. – ams

+2

Nếu sử dụng make, có thể đặt CC, CFLAGS, LDFLAGS và LDLIBS. LDLIBS = -lX11 trong trường hợp này làm điều đúng, do đó, "foo: foo.o" trở thành: 'cc foo.o -lX11 -o foo' –

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