2012-04-10 32 views
9

Tôi đang cố gắng sử dụng std.net.curl trên Ubuntu Linux 32 bit (11.10 Ocelot) bằng DMD 2.058.Lỗi liên kết std.net.curl trong Linux

Khi tôi xây dựng (dmd source.d) tôi nhận được:

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticCtor30FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticCtor30FZv+0x6): undefined reference to `curl_global_init' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticDtor31FZv': 
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticDtor31FZv+0x4): undefined reference to `curl_global_cleanup' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP4Impl6__dtorMFZv': 
std/net/curl.d:(.text._D3std3net4curl4HTTP4Impl6__dtorMFZv+0x12): undefined reference to `curl_slist_free_all' 
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP': 
std/net/curl.d:(.text._D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP+0x53): undefined reference to `curl_slist_append' 

[snip] 

tôi thêm -L-lcurl vào dòng lệnh của tôi (full lệnh: dmd source.d -L-lcurl) nhưng tôi nhận được kết quả chính xác như nhau. Tôi đã cài đặt libcurl4-openssl. Tôi có thể xây dựng một chương trình simple C curl trên máy tính này mà không có vấn đề (gcc simple.c -lcurl). Tôi không chắc nơi để nhìn từ đây để tìm ra điều này.

Cập nhật: Đây là cách các mối liên kết được gọi theo dmd -v:

gcc source.o -o source -m32 -lcurl -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt 
+1

Hãy thử chạy với '-v' (' dmd -v source.d -L-lcurl') để xem cách trình liên kết được gọi. – kennytm

+0

@KennyTM Cập nhật bài đăng với thông tin. – eco

Trả lời

0

tôi đã tìm ra nếu tôi được lệnh mối liên kết thông qua -v và sắp xếp lại nó để -lcurl là vào cuối nó liên kết mà không vấn đề.

gcc source.o -o source -m32 -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt -lcurl 

Tôi vẫn tò mò nếu có cách sửa lỗi này mà không cần chạy trình liên kết theo cách thủ công.

+2

Đã có thay đổi đối với ld hoặc gcc sao cho thứ tự đối số đó liên kết có vấn đề, điều gì đó về phụ thuộc. Đã có một lời giải thích khá tốt, nhưng dường như chỉ gây ra vấn đề như thế này. –

+1

Đúng, bạn có thể làm: 'dmd source.d -L-lphobos2 -L-lcurl' để sửa thứ tự liên kết. –

5

Như bạn đã phát hiện ra, thứ tự thư viện không chính xác. Trích dẫn từ "Giới thiệu về GCC": "Thư viện gọi hàm ngoài được xác định trong thư viện khác sẽ xuất hiện trước thư viện chứa hàm." Trong trường hợp của bạn libphobos gọi hàm (libcurl) của thư viện bên ngoài, vì vậy tôi đoán libphobos nên đi trước libcurl.

Sách có sẵn trực tuyến. Chương liên quan đến Cựu ước ở đây: http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

+0

Cảm ơn bạn đã liên kết. – eco

5

Trình biên dịch DMD rõ ràng bị phá vỡ theo khía cạnh này. Tôi đã xuất bản một bản vá để sửa chữa nó (có thể không phải là tốt nhất) nhưng người duy trì trình biên dịch không được thuyết phục điều này cần phải được sửa ở tất cả nên không có nhiều thảo luận về nó.

+0

Đã bỏ phiếu cho nó trên Bugzilla và đăng hỗ trợ cho nó trên GitHub. Nó hiện đang thất bại trong autotester. Các autotester đã gặp rắc rối gần đây mặc dù vì vậy nó có thể là do một cái gì đó bị hỏng trong HEAD. – eco

+0

Nó có thể là bản vá, nó đã được thực hiện cho D1 và autotester chỉ kiểm tra D2.Nên tầm thường để thích ứng, tôi không bao giờ làm điều đó vì thiếu sự quan tâm đến việc sáp nhập nó, nhưng tôi sẽ vui lòng làm như vậy nếu có sự quan tâm. –

+0

Trong trường hợp bạn không nhìn thấy nó, [đây là một cuộc thảo luận] (http://forum.dlang.org/thread/[email protected]) về vấn đề tôi có từ nhóm tin . – eco

3

Dường như cách đơn giản nhất để sửa chữa phobos2/curl vấn đề trật tự liên kết, như đã đề cập ở những nơi khác trong luồng này:

dmd source.d -L-lphobos2 -L-lcurl 

trình như một nét duyên dáng cho tôi.

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