2010-04-15 38 views
7

Tôi đang cố gắng xây dựng một chương trình chống lại wxWidgets và tôi gặp lỗi liên kết. Tôi thực sự hiểu ý nghĩa của nó. Lỗi này là:ELF: liên kết: Tại sao tôi nhận được các tham chiếu không xác định trong các tệp .so

/usr/lib/libwx_baseu-2.8.so: undefined reference to `std::ctype<char>::_M_widen_init() [email protected]_3.4.11' 

Điều tôi không hiểu là tại sao lỗi này là libwx_baseu-2.8.so. Tôi nghĩ rằng các tệp .so có tất cả các ký hiệu được giải quyết, trái với .o tệp vẫn cần liên kết.

Khi tôi ldd các .so, tôi nhận được có thể giải quyết tất cả các thư viện liên kết của nó, vì vậy không có vấn đề đó:

$ ldd /usr/lib/libwx_baseu-2.8.so 
linux-gate.so.1 => (0x00476000) 
libz.so.1 => /lib/libz.so.1 (0x00d9c000) 
libdl.so.2 => /lib/libdl.so.2 (0x002a8000) 
libm.so.6 => /lib/libm.so.6 (0x00759000) 
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x002ad000) 
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0068d000) 
libpthread.so.0 => /lib/libpthread.so.0 (0x006f0000) 
libc.so.6 => /lib/libc.so.6 (0x00477000) 
/lib/ld-linux.so.2 (0x007f6000) 

Liệu nó có nghĩa là các tập tin .so không được biên soạn một cách chính xác (trong trường hợp đó, nó một lỗi trong gói phân phối của tôi) hoặc có nghĩa là có các thư viện bị thiếu trên dòng lệnh của trình liên kết cho chương trình cụ thể của tôi không?

Ngoài ra, bạn có biết cách tôi có thể nhận danh sách các biểu tượng không xác định trong tệp ELF hay không. Tôi đã thử readelf -s nhưng tôi không thể tìm thấy biểu tượng bị thiếu.

Cảm ơn bạn.

Mildred

+0

Nếu bạn gặp sự cố khi liên kết, có thể hữu ích nếu bạn đăng dòng lệnh trình liên kết chính xác. – ndim

Trả lời

3

Tôi nghĩ bạn không liên kết đến một số thư viện khi liên kết chương trình của bạn.

Bạn nên liên kết trong chương trình của bạn cho tất cả các thư viện chia sẻ mà bạn liên kết đến trong .so bạn

Nếu .so được liên kết với một số thư viện tĩnh - nó không cần thiết trong chương trình liên kết với họ nếu tất cả những biểu tượng cần thiết được tìm thấy trong .so

Bạn có thể sử dụng nm lệnh linux để xem các biểu tượng trong tập tin đối tượng, thư viện hoặc nhị phân

Sửa
vấn đề cụ thể của bạn có thể được mô tả ở đây: http://old.nabble.com/-Bug-49433--gcc4.4,-NEW:-gcc4.4-misses-std::endl-implementation-at--O2%2B-td22836171.html

8

I thought that .so files had all its symbols resolved, contrary to .o files that still need linking.

thư viện chia sẻ có thể không đầy đủ, đó là OK.

do you know how I can get a list on undefined symbols in an ELF file

Sử dụng

nm -C -u libwx_baseu-2.8.so

+0

Cảm ơn bạn, đó là nó, nhưng rõ ràng, không có biểu tượng bị thiếu: $ nm: /usr/lib/libwx_baseu-2.8.so: không có ký hiệu nm: /usr/lib/libwx_baseu-2.8.so: no biểu tượng – Mildred

4

Khi bạn liên kết một thư viện chia sẻ đối với các thư viện khác chia sẻ (ví dụ liên kết libwx_baseu-2.8.so chống libstdc++.so), các hồ sơ liên kết phiên bản ký tự được sử dụng bởi libwx_baseu và được cung cấp bởi libstdc++.

Nếu vào thời gian chạy, bạn sử dụng một bản sao khác là libstdc++ (không cung cấp cùng một biểu tượng), bạn sẽ gặp lỗi (động) và chương trình không chạy chút nào (đây là thích hợp hơn với sự cố "bí ẩn" sau này). Tuy nhiên, những gì đang xảy ra ở đây là bạn cố gắng liên kết một tệp thực thi, có nghĩa là trình liên kết (tĩnh) muốn tìm tất cả các ký hiệu sẽ được yêu cầu trong thời gian chạy.Một lần nữa, bạn đang liên kết các tập tin thực thi với một (cũ) khác nhau (cũ) libstdc++.so, và do đó liên kết không thành công.

Có hai nguyên nhân gốc rễ thông thường:
- hoặc là bạn liên kết libwx_baseu-2.8.so trên một hệ thống khác nhau (một với phiên bản mới hơn của GCC), và sao chép nó vào hệ thống hiện tại, hoặc
- bạn đã liên kết với một libwx_baseu-2.8.so GCC mới hơn trên cùng một hệ thống, nhưng bây giờ đang cố gắng liên kết tệp thực thi với GCC cũ hơn.

1

Thử: đặt -fno-inline vào cờ của bạn trong Makefile. Về cơ bản g ++ 4.4 là có vấn đề mà không có nó. Hãy thử đặt nó HOẶC loại bỏ tùy chọn -O. Nó giải quyết cùng một vấn đề mà tôi có.

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