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?

Poorna
quelle
1
Ähnliche Frage: stackoverflow.com/questions/26243169/…
TManhente

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

Steveveire
quelle
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