C ++ için Maven benzeri bağımlılık yönetimi? [kapalı]


95

Birkaç alt projeye bölünmüş bir C ++ projem olduğunu varsayalım. Alt projenin tamamı bir DLL oluşturur ve her bir alt proje üzerinde farklı geliştirici ekipleri çalışır. Şimdi ana projeyi inşa etmek istersem, tüm alt projeleri tek başıma inşa etmek zorunda kalmamanın bir yolu var mı?

Kısacası, bağımlılık yönetimini (yani ikili dosyalar ve başlıklar için) Maven'in Java için yaptığı gibi yapan bir şey arıyorum.

Aslında bunun için Maven'i kullanmayı denedim ama bu oldukça zahmetli çünkü paketleri elle ve oldukça sık oluşturmak zorundayım, Maven en son değişiklikleri almayı özlüyor. Ayrıca, Maven içinden NAnt'ı çağırmak zorunda olduğum için derlemeyi çalıştırmak biraz kesmek gibi (Visual Studio çözümlerini doğrudan oluşturmak için NAnt'ın özelliğini kullanıyorum).

Bunun nasıl yapılacağına dair herhangi bir ipucu ve fikir?


Make'i kullanırken sorun, her şeyi en az bir kez oluşturmam ve bu nedenle bağımlılıklar için kaynak dosyalara da ihtiyacım olması. Özellikle bağımlı kitaplıkları yeniden oluştururken çok zaman alabilir ve üretkenliği ciddi şekilde etkileyebilir. Yoksa bir şey mi kaçırıyorum?
weberste

4
Bu faydalı bir soru gibi görünüyor. Belki bu soru, bu sorulara daha sıcak bakan başka bir siteye taşınabilir? C ++ bağımlılık yönetimi için en iyi uygulamaları arıyorum.
simgineer

Bu yaklaşık 10 yıl gecikti, bu yüzden burada 3 olasılık var: yanlış kullanıyorsunuz maven, tüm noktayı kaçırıyorsunuz mavenveya 10 yıl önce mavenC ++ için kullanmadığım zamanlarda C ++ için çok daha az kullanışlıydı. 2009 için konuşamam, ancak son yıllardaki deneyimlerden mavendolayı, tarif ettiğiniz problem için tam olarak kullanacağınız şey budur. Tam olarak istediğinizi ve oldukça verimli ve iyi bir şekilde yapar ve yaptığını iddia ettiğiniz olumsuz şeyleri yapmaz. Bunu 2019 veya sonrasında okuyan herkes maven, bu amaçla kullanmayı kesinlikle düşünmelidir .
searchengine27

Yanıtlar:


37

İlk Cevap : CMake kullanmanızı öneririm. Çok platformlu bir dosya oluşturucudur (aynı zamanda Visual Studio veya Eclipse CDT projeleri oluşturur).

http://www.cmake.org/

Onunla gerçekten iyi bir deneyim yaşadım. Bu konuda sevdiğim en iyi şey, genel proje yapısı üretme yeteneğiydi. Böylece, her seferinde komut dosyasını değiştirmeden, birim testleri vb. İçin alt proje aramalarını genel olarak dahil edebilirsiniz.

Ayrıca proje için gerekli olan önceden yüklenmiş derleme kitaplıklarının nasıl bulunacağına dair birçok modüle sahiptir (Boost, QT vb.)


Güncelleme : Bu arada, C ++ için paket yönetimi getirme çabası vardı. Bakmaya değer bazı projeler:

  • conan.io , büyük derleme araçlarıyla bütünleşir:
    • CMake
    • Görsel stüdyo
    • Makefile
    • XCode
    • ...
  • cpm CMake göre ( Not CPM aktif tutulan değildir.)
  • Buckaroo

Not yorumlar cpm @RAM tarafından sivri dışarı olarak artık etkin korunur.


7
Birkaç ay önce CMake'i kullandım ve gerçekten, önceden yüklenmiş kitaplıkları kontrol etmek çok iyi çalıştı. Ancak diğer ikili bağımlılıklar (yani benim alt projelerimden gelenler) kolaylıkla yönetilemedi. Bir şey mi kaçırıyorum?
weberste

3
@weberste, Aslında C / C ++ için maven benzeri bir araç yok. Geliştiriciler, bağımlılık yönetimini apt-get benzeri bir araçla gerçekleştirmeye çalışır.
SunnyShah

1
cpm aktif olarak
RAM

@RAM: Bunu belirttiğiniz için teşekkürler. Gönderiye size referansla bir not ekledim.
ovanes

2
CMake, bağımlılıkları bulma konusunda sınırlı yeteneğe sahip bir yapı sistemidir. NPM, Kargo vb.
Anlamında

17

Bağımlılık yönetimi için, bu tür bir aracı uygulayan yeni bir proje (bu bir başlangıç ​​şirketidir) var: https://github.com/biicode (bir C ++ bağımlılık yöneticisi). Bağımlılıklarınızı ekleyebilirsiniz ve çalışmalıdır.

Şu anda, projenin adıdır conan.io , onlar tarafından satın alındı JFrog .

GÜNCELLEME: Proje öldü ... Ne yazık ki, başlangıç ​​yeterli prim ödeyen müşteri alamadı gibi görünüyor, ancak sunucu iyi çalışıyor gibi görünüyor ...

UPDATE2: Görünüşe göre yedek bir proje var: conan.io (teşekkürler @mucaho)


Bağlantıyı kaldırabilirim .. proje kapatıldı, şimdi conan.io
carlos.baez

Güncelleme için teşekkürler! Çoğunlukla meraktan bakıyorum, dokümantasyon için github'larını araştırmak hala mümkün gibi görünüyor ; Muhtemelen bir noktada web sitesinde olduğu kadar güzel değil ama sanırım hiç yoktan iyidir. Merak ediyorum, conan.io sadece bir marka mı yoksa tamamen farklı bir ürün mü?
JRH

1
Yeniden marka değil, öğrenilen tüm derslerle sıfırdan tamamen yeni bir proje: tamamen açık kaynak, şirket içinde bir sunucu ile tamamen merkezi olmayan, tüm yapı sistemlerini destekler, ikili dosyaları yönetin.
drodri

8

Aşağıdaki üst düzey derleme sistemlerini öneririm:


Maven Nar eklentisi iyi destek alıyor. Kullandım ve şimdiye kadar beğendim. Ancak, Maven'in bir mono repo için iyi olmadığını anlamalısınız. Çoğu C ++ çözümü, bir Mono repo tanıtıcısı paylaşım kitaplıklarına vb. İhtiyaç duyar.
Hans

5

Yalnızca bağımlılık yönetimi istiyorsanız, Ivy'yi deneyin , Ant ile güzel bir şekilde bütünleşir (ve NAnt'ın aynı şeyi Ivy sitesinden bağlanan bu bloga dayanarak yapabileceğini varsayıyorum ).

Ayrıca Maven'in .Net versiyonu olan Byldan da vardır . Yine de bunun sizin için ne kadar işe yarayacağını bilmiyorum.


3

Make ve GCC, gerçekten iyi bir bağımlılık kontrolü için harika bir kombinasyondur.

GCC, örneğin belirli bir başlığa bağlı olan tüm kaynak dosyalarını yeniden oluşturabilmek için bağımlılık dosyalarını otomatik olarak oluşturabilir (-MD komut satırı anahtarı).

Makefilesime kesip yapıştırdığım bazı basit kurallarım var:

# compile c files   
%.o:    %.c
    ${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@

# compile c++ files
%.opp:  %.cpp
    ${CPP} ${CPPFLAGS} -c $< -MD -MF $(<:%.cpp=%.dep) -o $@

Şimdi, nesne dosyalarınız bir OBJ_C ve bir OBJ_CPP listesinde bildirilmişse:

.PHONY: cleandep
cleandep:
    rm -f $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

-include $(OBJ_C:%.o=%.dep) $(OBJ_CPP:%.opp=%.dep)

Elbette diğer projelerle olan bağımlılıkları takip edebilir ve örneğin, gerektiğinde paylaşılan bir kitaplığı yeniden inşa edebilir.

Örneğin, diğer takımlarınız her zaman en son DLL'lerini paylaşılan bir klasöre koyarsa:

myapp: ${SRC_CPP} ${LIB_DIR}other_team.lib
  ...

${LIB_DIR}other_team.lib: /shared_folder/latest/other_team.lib
  cp /shared_folder/latest/other_team.lib ${LIB_DIR}other_team.lib

bu çözümle ilgili endişelerimle ilgili soruya ekli
yorumuma bakın

Bir hedef başka bir dosyaya bağımlıysa, örneğin yürütülebilir dosyanız paylaşılan bir kitaplığa bağımlıysa, söz konusu paylaşılan kitaplık için, kitaplık kopyanızın kaynağa ihtiyaç duymadan güncel olmasını sağlayan bir kurala sahip olabilirsiniz, örneğin yalnızca getirerek belirli bir konumdan veya bazı sürüm kontrol güncellemelerini veya benzerlerini yürütmekten alınan en son kopya.
Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Tüm bu Make sembollerini ayrıştırmakta zorlandım, sanki bu g++ -c main.cc -MD -MF test, komut satırında bağımsız olarak çalıştırmak istersiniz ve sonuçları 'test' adlı bir dosyaya koyar gibi bir şeye dönüşüyor gibi görünüyor .
JRH


2

Bugünlerde kullandığım conan'ı tavsiye ederim . Projenizdeki tüm bağımlı kitaplıkları ve ikili dosyaları korumak çok güçlüdür.


1

Kullanılan kitaplıklar için NuGet paketi oluşturabilir ve bağımlılık yönetimi için NuGet'i kullanabilirsiniz.

Ayrıca bkz. NuGet for C ++


1
NuGet

@Toughy, bağımsız bir bağımlılık yönetimi olarak da kullanılabilir. (4M yürütülebilir dosya)
Yousha Aleayoub

0

Geliştiricilerin hayatını kolaylaştırmaya çalışan, Autotools'a benzer üst düzey işlevsellik sağlayan SCon'ların üzerinde oturan birkaç araç vardır (örn. WAF, SNOCS). Ne yazık ki, SCons'ın kendisi büyük bir dezavantaja sahiptir - büyük projeler için daha uzun derleme süresi.

Ben denemek için tavsiye edebilir SNOCS kolay bir bağımlılık yönetimi arayan ve derleyici x86 / x64, ayıklama / Yayın, statik / paylaşılan kütüphaneler, testi (tek komut derleme seçeneklerini seçerek o sizin için (bir Scons ters olduğu) / yükleme hedefleri vb.).

SNOCS ayrıca, proje konfigürasyon çıktısını ayrı dosyalarda saklayarak uzun derleme süresi sorununu çözmeye çalışır, bu da müteakip yapıların konfigürasyon aşamasını tamamen atlamasına ve doğrudan yapım aşamasına geçmesine olanak tanır (son özellik şu anda yapım aşamasındadır)

CMake'nin yapılandırması daha büyük çözümlerde sıkıcı hale gelir, bu nedenle derleme sistemi bakımı, geliştiricinin zamanının büyük bir kısmını alır. Neyse ki Martijn'in daha önce de bahsettiği gibi "projenizi bağımlılıkları ile oluşturmak için CMake kullanan" biicode var .


-1

SCons'u deneyin

SCons, bir Açık Kaynak yazılım oluşturma aracıdır; yani, yeni nesil bir oluşturma aracıdır. SCons'u, autoconf / automake'a benzer entegre işlevselliğe ve ccache gibi derleyici önbelleklerine sahip klasik Make yardımcı programının geliştirilmiş, çapraz platform alternatifi olarak düşünün. Kısacası, SCons, yazılım geliştirmenin daha kolay, daha güvenilir ve daha hızlı bir yoludur.


3
SCons, sorulduğu gibi yerleşik bir bağımlılık yönetimi veya depoya sahip değildir.
Maxime Viargues

-4

Tüm derleme bağımlılık sistemlerinin anasını kullanmanızı tavsiye ederim: make.


Bunu yoğun bir şekilde kullanıyorum. GCC, yiyebilecek 'yapıcı' bağımlılık dosyaları oluşturabilir. Başka bir yanıt için yeterli, belki ...
Will

8
Marka herkes / önlemek build -automation- sistemleri bakarak değiştirmek istediği aslında
Chila

-6

Scons deneyin, bağımlısı olacaksınız. Marka modası geçmiş, bakımı zor ve pahalıdır.


Scons'a bir göz attım ama ikili bağımlılıkları yönetmenin bir yolunu bulamadım. Bunun için bir örneğiniz var mı?
weberste

1
Scons python olduğundan, ikili bağımlılıklarınızı yönetmek istediğiniz her şeyi kolayca kodlayabilirsiniz. Belki ikili bağımlılıklarınızın dizininde bir "SConscript" olması da yardımcı olur. Buradaki gereksinimlerinizin ne olduğundan emin değilim. Pedro.
piotr

16
Yani "Neye ihtiyacınız olduğundan emin değilim, ancak Python'da kendiniz programlayabilirsiniz" üzerine kurulu bir araç öneriyorsunuz. Öyleyse neden scons'a ihtiyacınız var?
jalf
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.