CMake target_link_libraries Schnittstellenabhängigkeiten


92

Ich bin neu bei CMake und ein bisschen verwirrt mit den Schlüsselwörtern PUBLIC, PRIVATE und INTERFACE target_link_libraries(). In der Dokumentation wird erwähnt, dass sie verwendet werden können, um sowohl die Verbindungsabhängigkeiten als auch die Verbindungsschnittstelle in einem Befehl anzugeben.

Was bedeuten eigentlich Linkabhängigkeiten und Linkschnittstelle?


Antworten:


190

Wenn Sie eine gemeinsam genutzte Bibliothek erstellen und Ihre Quell-CPP-Dateien # die Header einer anderen Bibliothek enthalten (z. B. QtNetwork), Ihre Header-Dateien jedoch keine QtNetwork-Header enthalten, ist QtNetwork eine PRIVATEAbhängigkeit.

Wenn Ihre Quelldateien und Ihre Header die Header einer anderen Bibliothek enthalten, handelt es sich um eine PUBLICAbhängigkeit.

Wenn Ihre Header-Dateien, aber nicht Ihre Quelldateien die Header einer anderen Bibliothek enthalten, handelt es sich um eine INTERFACEAbhängigkeit.

Andere Build-Eigenschaften PUBLICund INTERFACEAbhängigkeiten werden an konsumierende Bibliotheken weitergegeben. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


37
Dies ist die klarste Erklärung für diese Frage, die ich je gehört habe. Ich wünschte, die cmake-Dokumentation wäre so klar! :-)
— Ela782

1
Vielen Dank für die Erklärung. Ich verstehe die Bedeutung jetzt, aber warum ist das Spezifizieren PUBLICoder PRIVATEwichtig? Was ändert sich?
— user3667089

8
Durch PRIVATEdie Verwendung werden Ihre Abhängigkeiten nicht zu Projekten hinzugefügt, die mit Ihrer Bibliothek verknüpft sind. Es ist sauberer und vermeidet mögliche Konflikte zwischen Ihren Abhängigkeiten und denen Ihrer Benutzer.
— user2658323

7
@steveire Aus Gründen der Klarheit kann es sinnvoll sein, ausdrücklich darauf hinzuweisen, dass "include" transitive Inklusion bedeutet, nicht nur direkte Inklusion. Wenn beispielsweise die Header-Dateien einer anderen Bibliothek nur direkt in Ihren Header-Dateien enthalten sind, alle Ihre Header-Dateien jedoch in Ihren Quelldateien enthalten sind, enthalten Ihre Quelldateien transitiv die Header-Dateien der anderen Bibliothek, sodass Sie keine PUBLICAbhängigkeit haben eine INTERFACEAbhängigkeit.
— Ose

Die cmake-Dokumentation sollte so präzise wie diese Antwort sein!
— Bryan Jyh Herng Chong
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.