Ý nghĩa của các từ khóa là gì PUBLIC
, PRIVATE
và INTERFACE
liên quan đến CMake của target_include_directories
?
Câu trả lời:
Những từ khóa này được sử dụng để cho biết khi nào danh sách các thư mục bao gồm bạn đang chuyển đến mục tiêu là cần thiết. Bởi khi nào , nó có nghĩa là nếu những thư mục đó bao gồm là cần thiết:
Khi CMake đang soạn thảo một mục tiêu, nó sử dụng các chỉ tiêu INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
và COMPILE_OPTIONS
tài sản. Khi bạn sử dụng PRIVATE
từ khóa trong target_include_directories()
và tương tự, bạn yêu cầu CMake điền các thuộc tính mục tiêu đó.
Khi CMake phát hiện ra sự phụ thuộc giữa mục tiêu A và mục tiêu B khác (như khi bạn sử dụng target_link_libraries(A B)
lệnh), nó sẽ truyền tải nhanh B
các yêu cầu sử dụng đến A
mục tiêu. Các yêu cầu sử dụng mục tiêu đó là thư mục bao gồm, định nghĩa biên dịch, v.v. mà bất kỳ mục tiêu nào phụ thuộc vào B
đều phải đáp ứng. Chúng được chỉ định bởi INTERFACE_*
phiên bản của các thuộc tính được liệt kê ở trên (như INTERFACE_INCLUDE_DIRECTORIES
) và được điền bằng cách sử dụng INTERFACE
từ khóa khi gọi target_*()
lệnh.
Các PUBLIC
từ khóa có nghĩa là xấp xỉ PRIVATE + INTERFACE
.
Do đó, giả sử bạn đang tạo một thư viện A
sử dụng một số tiêu đề Boost. Bạn sẽ làm:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
nếu bạn chỉ sử dụng các tiêu đề Tăng cường đó bên trong tệp nguồn ( .cpp
) hoặc tệp tiêu đề riêng ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
nếu bạn không sử dụng các tiêu đề Boost đó bên trong các tệp nguồn của mình (do đó, không cần chúng để biên dịch A
). Tôi thực sự không thể nghĩ ra một ví dụ trong thế giới thực cho điều này.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
nếu bạn sử dụng các tiêu đề Boost đó trong các tệp tiêu đề công khai của mình, các tiêu đề này được đưa vào CẢ HAI trong một số A
tệp nguồn của một số tệp và cũng có thể được đưa vào bất kỳ ứng dụng khách nào khác trong A
thư viện của bạn .Tài liệu CMake 3.0 có thêm chi tiết về đặc điểm kỹ thuật xây dựng và các thuộc tính yêu cầu sử dụng .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Điều này có nghĩa là trong thư viện của bạn, bạn có thể bao gồm các tệp trực tiếp, nhưng với tư cách là người dùng của thư viện, bạn phải chèn libname/
trước.
target_include_directories()
một đích thực thi nếu bạn cần đặt các thư mục bao gồm nơi tìm thấy các tệp tiêu đề được sử dụng bởi các tệp thực thi đó (ví dụ: Boost :: Program_options, nếu bạn sử dụng nó để phân tích cú pháp các đối số trong main()
hàm của mình ) . Bạn có thể sẽ sử dụng PRIVATE
từ khóa trong trường hợp này, vì những tệp này cần thiết để biên dịch chính tệp thực thi. Tuy nhiên, tôi không biết liệu có một số việc sử dụng cho INTERFACE
hoặc PUBLIC
trên tệp thực thi hay không.
Các từ khóa GIAO DIỆN, CÔNG KHAI và RIÊNG TƯ được yêu cầu để xác định phạm vi của các đối số sau. Các mục RIÊNG và CÔNG KHAI sẽ điền vào thuộc tính INCLUDE_DIRECTORIES của <target>. Các mục PUBLIC và INTERFACE sẽ điền vào thuộc tính INTERFACE_INCLUDE_DIRECTORIES của <target>. Các đối số sau chỉ định bao gồm các thư mục.
Từ tài liệu: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Để diễn đạt lại tài liệu bằng từ ngữ của riêng tôi: