CMake target_link_libraries Interface Dependencies


99

Tôi mới sử dụng CMake và hơi bối rối với các từ khóa CÔNG KHAI, RIÊNG TƯ và GIAO DIỆN liên quan đến target_link_libraries(). Tài liệu đề cập rằng chúng có thể được sử dụng để chỉ định cả phần phụ thuộc liên kết và giao diện liên kết trong một lệnh.

Sự phụ thuộc liên kết và giao diện liên kết thực sự có nghĩa là gì?


Câu trả lời:


201

Nếu bạn đang tạo một thư viện được chia sẻ và các tệp cpp nguồn của bạn #include header của một thư viện khác (Ví dụ: Giả sử QtNetwork), nhưng các tệp tiêu đề của bạn không bao gồm các tiêu đề QtNetwork, thì QtNetwork là một phần PRIVATEphụ thuộc.

Nếu các tệp nguồn của bạn và các tiêu đề của bạn bao gồm các tiêu đề của một thư viện khác, thì đó là một phần PUBLICphụ thuộc.

Nếu các tệp tiêu đề của bạn nhưng không phải tệp nguồn của bạn bao gồm các tiêu đề của thư viện khác, thì đó là một phần INTERFACEphụ thuộc.

Các thuộc tính xây dựng khác của PUBLICvà các INTERFACEphụ thuộc được truyền tới các thư viện tiêu thụ. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


40
Đây là lời giải thích rõ ràng nhất về câu hỏi này mà tôi từng nghe. Tôi ước tài liệu cmake rõ ràng như vậy! :-)
Ela782

1
Cảm ơn vì lời giải thích mà tôi hiểu ý nghĩa bây giờ nhưng tại sao lại chỉ định PUBLIChoặc PRIVATEquan trọng? Nó thay đổi những gì?
user3667089

8
Việc sử dụng PRIVATEkhông thêm phần phụ thuộc của bạn vào các dự án liên kết đến thư viện của bạn. Nó rõ ràng hơn và nó cũng tránh xung đột có thể xảy ra giữa các phụ thuộc của bạn và người dùng của bạn.
user2658323 23/02/17

7
@steveire Vì lý do rõ ràng, có thể cần nêu rõ rằng "bao gồm" có nghĩa là bao gồm bắc cầu, không chỉ bao gồm trực tiếp. Ví dụ: nếu các tệp tiêu đề của một thư viện khác chỉ được các tệp tiêu đề của bạn trực tiếp đưa vào, nhưng tất cả các tệp tiêu đề của bạn đều được các tệp nguồn của bạn bao gồm, thì các tệp nguồn của bạn sẽ bao gồm các tệp tiêu đề của thư viện khác một cách tạm thời và do đó, bạn có phần PUBLICphụ thuộc, không một INTERFACEsự phụ thuộc.
OSE

Tài liệu cmake nên viết ngắn gọn như câu trả lời này!
Bryan Jyh Herng Chong
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.