2013-07-03 25 views
5

Tôi đang cố gắng để 's ld để bỏ qua các tham chiếu chưa được giải quyết khi đặt cùng một thư viện được chia sẻ từ một loạt các tệp đối tượng được biên dịch với cờ -fpic.nhận ld để bỏ qua các tham chiếu không xác định khi tạo một lib được chia sẻ

Tôi đã thử một loạt các tùy chọn cho đến nay như (thay thế các tên file dài trong nhiều file đối tượng với một vài những cái nhỏ cho ngắn gọn):

ld --allow-shlib-undefined --unresolved-symbols=ignore-all -shared 1.o 2.o -o lib0.so 
ld -G 1.o 2.o -o lib0.so 

(Tôi đã đỏ somewhere rằng -G sẽ cho phép tài liệu tham khảo chưa được giải quyết, nhưng không có may mắn với nó.)

Chạy nó mặc dù gcc (với -Wl,--unresolved-symbols=ignore-all) kết quả trong tài liệu tham khảo chưa được giải quyết ít vì nó liên kết theo mặc định với

-lstdc++ -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 -liconv -lmingw32 -lgcc_s -lgcc -lmoldname -lmingwex -lmsvcrt 

nhưng vẫn phàn nàn về việc không có -lopengl32-lgdi32.

Biên dịch lib mà không -fpic, stashing tất cả các file đối tượng trong một .a với ar và tĩnh liên kết với nó trong khi có chương trình liên kết exe để -lopengl32-lgdi32 kết quả làm việc hoàn toàn tốt.

Các thông báo lỗi thực tế (thay thế các tập tin và chức năng tên dài cho ngắn gọn):

[file].o: In function `[function]': [file].cpp:19: undefined reference to `memcpy' 
[file].o: In function `[function]': [file].cpp:26: undefined reference to `memcpy' 

[file].o:[file].cpp:(.xdata+0x4c): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.xdata+0x74): undefined reference to `__gxx_personality_seh0' 
[file].o:[file].cpp:(.rdata$[file]]+0x20):undefined reference to `__cxa_pure_virtual' 
[file].o:[file].cpp:(.rdata$[file]]+0x28): undefined reference to `__cxa_pure_virtual' 

Làm thế nào tôi có thể nhận được ld để bỏ qua tài liệu tham khảo không xác định (ít nhất là từ libopengl32libgdi32 nếu không libstdc++ vv quá) và hãy để chương trình thats sẽ sử dụng nó liên kết với họ?

+0

Khi tôi gặp lỗi '__gxx_personality_seh0 'trong nội dung tôi đã biên dịch bằng g ++ thay vì gcc và nó đã biến mất. Xem nếu điều đó làm việc cho bạn. –

+0

@JerryJeremiah Thats chỉ là một trong rất nhiều lỗi có, về cơ bản một cho mỗi cuộc gọi đến bất kỳ chức năng std như 'memcpy', bất kỳ cuộc gọi đến opengl, vv Và điểm là tôi đang cố gắng sử dụng 'ld' không 'g ++', chương trình biên dịch tốt cho các tập tin '.o', tôi chỉ muốn' ld' tạo ra một thư viện chia sẻ ra khỏi các tệp '.o' trong khi không liên kết với các thư mục lib khác. Nó hoạt động tốt khi sử dụng 'ld' để tạo một lib tĩnh, nhưng khi tạo một lib chung, nó phàn nàn về việc không liên kết đến stdlib, opengllib, vv. Chương trình sử dụng các liên kết lib tĩnh tới std, opengl vv, nó nên trong lý thuyết làm việc để chia sẻ quá. –

Trả lời

0

Làm thế nào tôi có thể nhận ld để bỏ qua tài liệu tham khảo không xác định

GNU ld (và hầu hết linkers UNIX khác) đã bỏ qua tài liệu tham khảo không xác định khi xây dựng một thư viện chia sẻ.

Dường như bạn có thể ở trên AIX, nơi thư viện và tệp thi hành được chia sẻ rất giống nhau và áp dụng các quy tắc đặc biệt. g++ -shared ... vẫn hoạt động ngay cả trên AIX.

+0

Tôi không chắc chắn những gì bạn có ý nghĩa của AIX, tôi nên đã đề cập đến điều này, nhưng tôi đang trên Win8 với bản phát hành mingw mới nhất ('gcc (rev0, Xây dựng bởi MinGW-xây dựng dự án) 4.8.1') và ('GNU ld (GNU Binutils) 2.23.2') và không có,' g ++ -shared ... -o libout.so' cho kết quả không có tham chiếu không xác định từ stdlib nhưng nó vẫn nhấn mạnh vào việc có opengl32 và gdi được liên kết. ('undefined reference to '__imp_glCullFace'',' undefined reference to' __imp_glClearDepth'' etc), nhờ gợi ý mặc dù, bất kỳ ý tưởng nào khác tại sao 'ld' dường như bỏ qua' --unresolved-symbols = ignore-all'? –

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