CMake target_link_libraries Arayüz Bağımlılıkları


101

CMake'de yeniyim ve ilgili PUBLIC, PRIVATE ve INTERFACE anahtar kelimeleriyle biraz kafam karıştı target_link_libraries(). Dokümantasyon, bunların hem bağ bağımlılıklarını hem de bağlantı arayüzünü tek bir komutta belirtmek için kullanılabileceğini belirtir.

Bağlantı bağımlılıkları ve bağlantı arayüzü aslında ne anlama geliyor?


Yanıtlar:


204

Paylaşılan bir kitaplık oluşturuyorsanız ve kaynak cpp dosyalarınız # başka bir kitaplığın başlıklarını dahil edin (örneğin, QtNetwork), ancak başlık dosyalarınız QtNetwork başlıklarını içermiyorsa, QtNetwork bir PRIVATEbağımlılıktır.

Kaynak dosyalarınız ve başlıklarınız başka bir kitaplığın başlıklarını içeriyorsa, bu bir PUBLICbağımlılıktır.

Başlık dosyalarınız, ancak kaynak dosyalarınız başka bir kitaplığın başlıklarını içermiyorsa, bu bir INTERFACEbağımlılıktır.

Diğer yapı özellikleri PUBLICve INTERFACEbağımlılıkları, tüketen kitaplıklara yayılır. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


41
Bu şimdiye kadar duyduğum bu sorunun en net açıklaması. Cmake belgelerinin bu kadar açık olmasını dilerdim ! :-)
Ela782

1
Açıklama için teşekkürler şimdi anlamını anlıyorum ama neden belirtmek PUBLICveya PRIVATEönemli? Neyi değiştirir?
user3667089

9
Kullanmak PRIVATE, kitaplığınıza bağlanan projelere bağımlılıklarınızı eklemez. Daha temizdir ve bağımlılıklarınız ile kullanıcınız arasındaki olası çatışmaları da önler.
user2658323

7
@steveire Açıklık adına, "dahil et" ifadesinin yalnızca doğrudan dahil etme değil, geçişli dahil etme anlamına geldiğini açıkça belirtmek faydalı olabilir. Örneğin, başka bir kitaplığın başlık dosyaları yalnızca doğrudan başlık dosyalarınız tarafından dahil ediliyorsa, ancak tüm başlık dosyalarınız kaynak dosyalarınızda yer alıyorsa, o zaman kaynak dosyalarınız geçişli olarak diğer kitaplığın başlık dosyalarını içerir ve bu nedenle bir PUBLICbağımlılığa sahip değilsiniz bir INTERFACEbağımlılık.
Ose

Cmake belgeleri, bu yanıt kadar kısa ve öz olarak yazmalıdır!
Bryan Jyh Herng Chong

1

@steveire cevap harika. Farkı hızlıca görmek için bir tablo eklemek istedim:

.-----------.------------------.----------------.
|           | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC    |        X         |        X       |
:-----------+------------------+----------------:
| PRIVATE   |        X         |                |
:-----------+------------------+----------------:
| INTERFACE |                  |        X       |
'-----------'------------------'----------------'
  • Hedefe göre bağlantılı : hedef kaynaklarda bulunan kitaplıklar (kitaplığı bağlayan projeler için bir bağımlılık değildir).
  • Bağlantı arabirimi : hedef genel başlıklarda bulunan kitaplıklar (kitaplığı bağlayan projeler için bağımlılıklar).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.