CMake target_link_libraries Interface Dependencies


99

ฉันยังใหม่กับ CMake และสับสนเล็กน้อยกับคำหลักtarget_link_libraries()สาธารณะ, ส่วนตัวและอินเตอร์เฟซที่เกี่ยวข้องกับ. เอกสารระบุว่าสามารถใช้เพื่อระบุทั้งการอ้างอิงลิงก์และอินเทอร์เฟซลิงก์ในคำสั่งเดียว

การอ้างอิงลิงค์และอินเทอร์เฟซลิงค์หมายถึงอะไร?


1
คำถามที่คล้ายกัน: stackoverflow.com/questions/26243169/…
TManhente

คำตอบ:


202

หากคุณกำลังสร้างไลบรารีที่ใช้ร่วมกันและไฟล์ cpp ต้นทางของคุณ # รวมส่วนหัวของไลบรารีอื่น (เช่นพูด QtNetwork) แต่ไฟล์ส่วนหัวของคุณไม่มีส่วนหัว QtNetwork ดังนั้น QtNetwork จะเป็นการPRIVATEอ้างอิง

หากไฟล์ต้นฉบับและส่วนหัวของคุณมีส่วนหัวของไลบรารีอื่นแสดงว่าเป็นการPUBLICอ้างอิง

หากไฟล์ส่วนหัวของคุณ แต่ไม่มีไฟล์ต้นฉบับของคุณมีส่วนหัวของไลบรารีอื่นแสดงว่าเป็นการINTERFACEอ้างอิง

คุณสมบัติการสร้างอื่น ๆ ของPUBLICและการINTERFACEอ้างอิงจะแพร่กระจายไปยังไลบรารีที่ใช้งาน http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


40
นี่เป็นคำอธิบายที่ชัดเจนที่สุดสำหรับคำถามนี้ที่ฉันเคยได้ยินมา ฉันหวังว่าเอกสาร cmakeจะชัดเจน! :-)
Ela782

1
ขอบคุณสำหรับคำอธิบายตอนนี้ฉันเข้าใจความหมาย แต่ทำไมการระบุPUBLICหรือPRIVATEสำคัญ? มันเปลี่ยนอะไร?
user3667089

8
การใช้PRIVATEไม่ได้เพิ่มการอ้างอิงของคุณไปยังโปรเจ็กต์ที่เชื่อมโยงกับไลบรารีของคุณ มันสะอาดกว่าและยังหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นระหว่างการอ้างอิงของคุณกับผู้ใช้ของคุณ
user2658323

7
@steveire เพื่อความชัดเจนอาจมีค่าควรระบุอย่างชัดเจนว่า "รวม" หมายถึงการรวมแบบสกรรมกริยาไม่ใช่แค่การรวมโดยตรง เช่นหากไฟล์ส่วนหัวของไลบรารีอื่นรวมอยู่ในไฟล์ส่วนหัวของคุณโดยตรงเท่านั้น แต่ไฟล์ส่วนหัวทั้งหมดของคุณรวมอยู่ในไฟล์ต้นฉบับของคุณไฟล์ต้นฉบับของคุณจะรวมไฟล์ส่วนหัวของไลบรารีอื่นไว้ด้วยกันดังนั้นคุณจึงมีการPUBLICพึ่งพาไม่ใช่ การINTERFACEพึ่งพา
Ose

เอกสาร cmake ควรเขียนให้กระชับเหมือนคำตอบนี้!
Bryan Jyh Herng Chong
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.