Các tùy chọn dòng lệnh --start-group và --end-group là gì?


83

Mục đích của các tùy chọn dòng lệnh đó là gì? Vui lòng giúp giải mã ý nghĩa của dòng lệnh sau:

-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib

Rõ ràng là nó có liên quan gì đó đến việc liên kết, nhưng hướng dẫn sử dụng GNU không hiểu chính xác ý nghĩa của nhóm là gì.

Câu trả lời:


95

Nó là để giải quyết sự phụ thuộc vòng tròn giữa một số thư viện (được liệt kê giữa -(-)).

Trích dẫn Tại sao thứ tự các thư viện được liên kết đôi khi gây ra lỗi trong GCC? hoặc man ld http://linux.die.net/man/1/ld

-( kho lưu trữ -) hoặc --start-group kho lưu trữ --end-group

Các kho lưu trữ phải là một danh sách các tệp lưu trữ. Chúng có thể là tên tệp rõ ràng hoặc tùy chọn -l.

Các kho lưu trữ được chỉ định được tìm kiếm nhiều lần cho đến khi không có tham chiếu không xác định mới nào được tạo. Thông thường, một kho lưu trữ chỉ được tìm kiếm một lần theo thứ tự mà nó được chỉ định trên dòng lệnh. Nếu một ký hiệu trong kho lưu trữ đó là cần thiết để giải quyết một ký hiệu không xác định được tham chiếu bởi một đối tượng trong kho lưu trữ xuất hiện sau đó trên dòng lệnh, trình liên kết sẽ không thể phân giải tham chiếu đó. Bằng cách nhóm các kho lưu trữ, tất cả chúng đều được tìm kiếm nhiều lần cho đến khi tất cả các tài liệu tham khảo có thể được giải quyết.

Sử dụng tùy chọn này có một chi phí hiệu suất đáng kể. Tốt nhất là chỉ sử dụng nó khi không thể tránh khỏi các tham chiếu vòng giữa hai hoặc nhiều kho lưu trữ.

Vì vậy, các thư viện bên trong nhóm có thể được tìm kiếm các ký hiệu mới một vài lần và bạn không cần cấu trúc xấu xí như -llib1 -llib2 -llib1

PS archive về cơ bản có nghĩa là một thư viện tĩnh ( *.atệp)


1
Đã được chấp nhận. Một nhận xét: Tôi tin rằng GCC sẽ dành cho các thư viện động trước tiên, trừ khi tên tệp đầy đủ (bao gồm cả đường dẫn và hậu tố .a) được chuyển vào dòng lệnh. -llib1 sẽ khiến GCC cố gắng liên kết đến tệp% .so trước và sau đó thử tệp% .a.
pic11

1
@ pic11, cảm ơn. Việc liên kết được thực hiện bởi ld và bạn có thể thấy các thư viện được tìm kiếm như thế nào với -Wl,--verbosetùy chọn thêm vào gcc (nó sẽ được chuyển --verbosetới trình liên kết ld). Ví dụ cho -ltestthư viện: attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n . Trình liên kết cố gắng mở .sotrước, nhưng sau đó trình liên kết cố gắng mở .a. Nó được thực hiện trong mọi thư mục trong dirs tìm kiếm thư viện.
osgx

"đã tìm kiếm các ký hiệu mới nhiều lần"? Tôi nghĩ rằng tìm kiếm hai lần là đủ để giải quyết tất cả các ký hiệu. Đó không phải là một chi phí hiệu suất đáng kể .
Jimm Chen

9
Xin lỗi, cuối cùng tôi nhận ra "tìm kiếm hai lần" là không đủ.
Jimm Chen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.