CMake target_include_directories nghĩa của phạm vi


Câu trả lời:


125

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:

  • Để biên dịch chính mục tiêu đó.
  • Để biên dịch các mục tiêu khác phụ thuộc vào mục tiêu đó (như sử dụng tiêu đề công khai của nó).
  • Trong cả hai tình huống trên.

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_DEFINITIONSCOMPILE_OPTIONStài sản. Khi bạn sử dụng PRIVATEtừ 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 Amụ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 INTERFACEtừ khóa khi gọi target_*()lệnh.

Các PUBLICtừ khóa có nghĩa là xấp xỉ PRIVATE + INTERFACE.

Do đó, giả sử bạn đang tạo một thư viện Asử 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ố Atệ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 Athư 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 .


18
Liên quan đến một ví dụ trong thế giới thực của 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.
KaareZ

2
Câu trả lời này có ý nghĩa đối với tôi cho việc tạo thư viện. Nhưng làm thế nào về việc gọi target_include_directories cho một mục tiêu là một tệp thực thi?
Norman Pellet

1
@NormanPellet: Bạn có thể gọi 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 PRIVATEtừ 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 INTERFACEhoặc PUBLICtrên tệp thực thi hay không.
TManhente

13

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:

  • bạn muốn thêm một thư mục vào danh sách thư mục bao gồm cho một mục tiêu
  • với PRIVATE thư mục được thêm vào thư mục bao gồm của mục tiêu
  • với INTERFACE mục tiêu không bị sửa đổi, nhưng INTERFACE_INCLUDE_DIRECTORIES được mở rộng bởi thư mục. Biến là danh sách các thư mục bao gồm chung cho một thư viện.
  • với PUBLIC cả hai hành động từ PRIVATE và INTERFACE đều được thực hiện.

5
Tôi đã xem qua tài liệu CMAKE, nhưng tôi vẫn không hiểu chúng thực sự có nghĩa là gì và trong ngữ cảnh nào (tạo tệp hoặc cách chúng biên dịch)?
Sirish

@Sirish: Tôi đã cố gắng diễn đạt lại tài liệu, hy vọng điều đó có ích.
usr1234567
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.