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
và -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
và -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ừ libopengl32
và libgdi32
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ọ?
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. –
@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á. –