ความหมายของคำหลักคืออะไรPUBLIC
, PRIVATE
และINTERFACE
เกี่ยวข้องกับ CMake ของtarget_include_directories
?
ความหมายของคำหลักคืออะไรPUBLIC
, PRIVATE
และINTERFACE
เกี่ยวข้องกับ CMake ของtarget_include_directories
?
คำตอบ:
คำหลักเหล่านี้ใช้เพื่อบอกว่าเมื่อใดที่จำเป็นต้องมีรายการรวมไดเรกทอรีที่คุณส่งผ่านไปยังเป้าหมาย โดยเมื่อมันหมายความว่าถ้าเหล่านั้นรวมถึงไดเรกทอรีที่มีความจำเป็น:
เมื่อ CMake จะรวบรวมเป้าหมายจะใช้เป้าหมายINCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
และCOMPILE_OPTIONS
คุณสมบัติ เมื่อคุณใช้PRIVATE
คีย์เวิร์ดในลักษณะtarget_include_directories()
เดียวกันคุณจะบอกให้ CMake เติมข้อมูลคุณสมบัติเป้าหมายเหล่านั้น
เมื่อ CMake ตรวจพบการพึ่งพาระหว่างเป้าหมาย A และเป้าหมายอื่น B (เช่นเมื่อคุณใช้target_link_libraries(A B)
คำสั่ง) มันจะเผยแพร่B
ข้อกำหนดการใช้งานไปยังA
เป้าหมาย ข้อกำหนดการใช้งานเป้าหมายเหล่า นี้ ได้แก่ ไดเร็กทอรีรวมนิยามคอมไพล์ ฯลฯ ที่เป้าหมายใด ๆ ที่ขึ้นอยู่กับB
ต้องเป็นไปตาม คุณสมบัติเหล่านี้ระบุโดยINTERFACE_*
เวอร์ชันของคุณสมบัติที่ระบุไว้ด้านบน (like INTERFACE_INCLUDE_DIRECTORIES
) และจะถูกเติมโดยใช้INTERFACE
คีย์เวิร์ดเมื่อเรียกtarget_*()
คำสั่ง
หมายความว่าคำหลักประมาณPUBLIC
PRIVATE + INTERFACE
ดังนั้นสมมติว่าคุณกำลังสร้างไลบรารีA
ที่ใช้ส่วนหัวของ Boost คุณจะทำ:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
หากคุณใช้เฉพาะส่วนหัว Boost เหล่านั้นในไฟล์ต้นฉบับของคุณ ( .cpp
) หรือไฟล์ส่วนหัวส่วนตัว ( .h
)target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
หากคุณไม่ได้ใช้ส่วนหัว Boost เหล่านั้นในไฟล์ต้นฉบับของคุณ (ดังนั้นไม่จำเป็นต้องใช้ในการคอมไพล์A
) ฉันไม่สามารถนึกถึงตัวอย่างในโลกแห่งความเป็นจริงสำหรับสิ่งนี้ได้target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
หากคุณใช้ส่วนหัว Boost เหล่านั้นในไฟล์ส่วนหัวสาธารณะของคุณซึ่งรวมอยู่ในA
ไฟล์ต้นฉบับบางไฟล์และอาจรวมอยู่ในไคลเอนต์อื่น ๆ ของA
ไลบรารีของคุณด้วยเอกสาร CMake 3.0 มีรายละเอียดเพิ่มเติมเกี่ยวกับข้อกำหนดโครงสร้างนี้และคุณสมบัติข้อกำหนดการใช้งาน
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. ซึ่งหมายความว่าภายในไลบรารีของคุณคุณสามารถรวมไฟล์ได้โดยตรง แต่ในฐานะผู้ใช้ไลบรารีคุณต้องแทรกlibname/
ก่อน
target_include_directories()
หาเป้าหมายที่เรียกใช้งานได้หากคุณต้องการตั้งค่ารวมไดเรกทอรีที่จะพบไฟล์ส่วนหัวที่ใช้โดยไฟล์ปฏิบัติการเหล่านั้น (ตัวอย่างเช่น: Boost :: Program_options หากคุณใช้เพื่อแยกวิเคราะห์อาร์กิวเมนต์ในmain()
ฟังก์ชันของคุณ) . คุณอาจใช้PRIVATE
คีย์เวิร์ดในกรณีนี้เนื่องจากไฟล์เหล่านี้จำเป็นในการคอมไพล์ไฟล์ปฏิบัติการเอง ฉันไม่รู้ว่ามีการใช้งานสำหรับINTERFACE
หรือPUBLIC
บนปฏิบัติการหรือไม่
คีย์เวิร์ด INTERFACE, PUBLIC และ PRIVATE จำเป็นต้องระบุขอบเขตของอาร์กิวเมนต์ต่อไปนี้ รายการที่เป็นส่วนตัวและสาธารณะจะเติมคุณสมบัติ INCLUDE_DIRECTORIES ของ <target> รายการ PUBLIC และ INTERFACE จะเติมคุณสมบัติ INTERFACE_INCLUDE_DIRECTORIES ของ <target> อาร์กิวเมนต์ต่อไปนี้ระบุรวมถึงไดเร็กทอรี
จากเอกสาร: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
ในการเรียบเรียงเอกสารใหม่ด้วยคำพูดของฉันเอง: