Chúng tôi có một cơ sở mã được chia thành các thư viện tĩnh. Thật không may, các thư viện có phụ thuộc vòng tròn; ví dụ: libfoo.a
tùy thuộc vào libbar.a
và ngược lại.Giải quyết các phụ thuộc vòng tròn bằng cách liên kết cùng một thư viện hai lần?
Tôi biết "đúng" cách xử lý này là sử dụng của mối liên kết --start-group
và --end-group
tùy chọn, như vậy:
g++ -o myApp -Wl,--start-group -lfoo -lbar -Wl,--end-group
Nhưng trong Makefiles hiện của chúng tôi, vấn đề thường được xử lý như thế này:
g++ -o myApp -lfoo -lbar -lfoo
(Hãy tưởng tượng này kéo dài đến ~ 20 thư viện với sự phụ thuộc phức tạp.)
tôi đã được trải qua ou r Makefiles thay đổi hình thức thứ hai để đầu tiên, nhưng bây giờ đồng nghiệp của tôi đang hỏi tôi tại sao ... Và khác hơn "bởi vì nó sạch hơn" và một cảm giác mơ hồ rằng hình thức khác là nguy hiểm, tôi không có một câu trả lời tốt.
Vì vậy, có thể liên kết cùng một thư viện nhiều lần bao giờ có tạo sự cố không? Ví dụ, có thể liên kết thất bại với các biểu tượng được xác định nhân nếu cùng một .o được kéo vào hai lần? Hoặc có bất kỳ rủi ro nào chúng ta có thể làm nảy sinh với hai bản sao của cùng một đối tượng tĩnh, tạo ra các lỗi nhỏ không?
Về cơ bản, tôi muốn biết liệu có khả năng xảy ra lỗi liên kết hoặc thời gian chạy liên kết từ cùng một thư viện nhiều lần không; và nếu có, làm thế nào để kích hoạt chúng. Cảm ơn.
Vấn đề duy nhất tôi có thể nghĩ đến là khi bạn quản lý liên kết với hai phiên bản khác nhau của cùng một thư viện. Đó là khó để làm và (IMO) là dường như không xảy ra trên Linux. Ngoài ra, chỉ có 20 thư viện không giống nhiều. Có đáng để đi qua makefiles không? Bạn có thể dành thời gian đó làm việc khác. – SigTerm
Sự cố này sẽ biến mất nếu bạn sửa các thư viện của mình không có phụ thuộc vòng tròn. –
Tôi giả sử loại bỏ phụ thuộc vòng tròn bằng cách kiểm tra và phá vỡ các thư viện là không khả thi? Bởi vì đó sẽ là cách sạch nhất –