Là phụ thuộc thư viện tĩnh lồng nhau có thể?


11

Tôi đang làm việc tại QT.

  1. Một thư viện tĩnh có thể phụ thuộc vào một thư viện tĩnh khác không? (Lib tĩnh được tạo bằng cách liên kết một lib tĩnh khác)
  2. Nếu có, có thể là sau khi liên kết với lib2, lib (lib1) được tạo sẽ không chứa tất cả các mã của lib2?

Trong Dự án Qt của tôi, tôi đang sử dụng một thư viện tĩnh, phụ thuộc vào nhiều thư viện. Tôi đã phải thêm tất cả các thư viện (với tất cả các tiêu đề của chúng trong dự án của tôi), mặc dù tôi chỉ cần một lib (và một .h của lớp đó) trong mã của tôi.

Hãy giải thích kịch bản.

Câu trả lời:


6

Khi bạn tuyên bố một cái gì đó, bạn chỉ cần hứa rằng trong quá trình liên kết, nó sẽ có sẵn và được xác định duy nhất. Libs tĩnh không có gì khác hơn là các thùng chứa cho các định nghĩa ở định dạng nằm ngoài tiêu chuẩn. Vì vậy, điều này có ý nghĩa sau đây:

1) Tôi hoàn toàn không hiểu những gì bạn yêu cầu ở đây, nhưng một thư viện tĩnh có thể phụ thuộc rất nhiều vào một thư viện tĩnh khác. Hoặc bạn hứa rằng các định nghĩa của thư viện đó sẽ có sẵn trong giai đoạn liên kết cuối cùng của tệp thực thi của bạn (bằng cách cung cấp nó dưới dạng phụ thuộc liên kết). Hoặc bạn "hợp nhất" nó trong quá trình liên kết của lib tĩnh.

2) Câu trả lời cho điều này sau đó trở thành điều duy nhất bạn cần làm chỉ đơn giản là không liên kết trong lib2 trong quá trình liên kết của lib1.

Nhìn chung, cách tiếp cận tốt nhất theo kinh nghiệm của tôi là chỉ hợp nhất các lib là riêng tư, lý do là nếu không khách hàng sẽ gặp phải các vi phạm biểu tượng được xác định nhiều lần khi các phần khác trong dự án của họ chia sẻ phụ thuộc với bạn.


Điều đó có nghĩa là, một lib tĩnh phụ thuộc vào một lib tĩnh khác, nhưng chứa thông tin liên kết của lib đó là POSSIBLE. Điều đó có nghĩa là khi tôi cần đưa lib đầu tiên vào dự án của mình, tôi cũng buộc phải bao gồm cả lib thứ hai. Bcoz, lib đầu tiên không chứa toàn bộ mã của lib thứ hai. Tôi đúng không?
sk patra

6

Hai bit nhanh của tôi về điều này: 10 (xin lỗi trò đùa khủng khiếp).

Để mở rộng một chút, ở đây đi:

1- Thư viện tĩnh có thể phụ thuộc vào thư viện tĩnh khác, không có gì hoặc thậm chí là thư viện động: trong hai trường hợp đầu tiên, tất cả mã cho thư viện tĩnh mới sẽ được kết hợp trong SLL mới (Thư viện liên kết tĩnh), tuy nhiên, tùy chọn thứ 3 , tùy thuộc vào sự lảng tránh có thể dẫn đến SLL có một trong những kết quả sau đây,

  • nó sẽ chứa các phiên bản tĩnh của mã được yêu cầu bởi nó được thu thập từ DLL (Thư viện liên kết động)
  • hoặc khủng khiếp hơn nhiều, bạn sẽ có một thư viện tĩnh mà khi đưa vào một dự án sẽ gây ra yêu cầu vận chuyển với một DLL, phá vỡ toàn bộ điểm liên kết tĩnh.

Vì vậy, trong ngắn hạn, bạn có thể liên kết thư viện tĩnh với thư viện tĩnh

2- nếu lib1 và lib2 đều tĩnh và lib1 đã được liên kết với lib2, thì tất cả chức năng của lib2 sẽ có sẵn trong lib1 mà không cần bao gồm lib2 vì lib2 sẽ được liên kết tĩnh trong lib1 (nghĩ là búp bê Nga, với lib2 là nhỏ hơn).

Trong kịch bản bạn mô tả phải có chức năng riêng biệt có sẵn trong mỗi tệp bạn phải đưa vào, không được liên kết tĩnh, do đó cần nhiều tệp, nếu không bạn sẽ có một tệp duy nhất để bao gồm và bạn sẽ ổn.

Thực hiện như sau: Một tệp .h có tham chiếu đến 6 thư viện được liên kết tĩnh: bạn sẽ cần bao gồm 7 tệp trong dự án của mình để có đầy đủ chức năng

ví dụ bao gồm 1

Một SLL được tạo từ tệp .h đã nói sẽ chỉ yêu cầu SLL mới được đưa vào để liên kết khi biên dịch:

ví dụ bao gồm 2

Hy vọng điều này sẽ giúp và tôi đã hiểu những gì bạn đang hỏi.

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.