Zarządzanie zależnościami w stylu Mavena dla C ++? [Zamknięte]


94

Powiedzmy, że mam projekt C ++, który jest podzielony na kilka podprojektów. Wszystkie podprojekty tworzą bibliotekę DLL, a różne zespoły programistów pracują nad każdym z podprojektów. Jeśli teraz chcę zbudować główny projekt, czy jest sposób, aby uniknąć konieczności samodzielnego tworzenia wszystkich podprojektów?

Krótko mówiąc, szukam czegoś, co zarządza zależnościami (np. Dla plików binarnych i nagłówków) w podobny sposób, jak robi to Maven dla Javy.

W rzeczywistości próbowałem użyć do tego Mavena, ale jest to raczej kłopotliwe, ponieważ muszę tworzyć pakiety ręcznie i dość często, Maven pomija ostatnie zmiany. Również uruchomienie kompilacji jest trochę hackem, ponieważ muszę wywołać NAnt z poziomu Mavena (używam funkcji NAnt do bezpośredniego tworzenia rozwiązań Visual Studio).

Jakieś wskazówki i pomysły, jak to zrobić?


Problem przy używaniu make polega na tym, że muszę wszystko zbudować co najmniej raz i dlatego potrzebuję również plików źródłowych dla zależności. Szczególnie podczas odbudowywania bibliotek zależnych może to być bardzo czasochłonne i poważnie wpływać na produktywność. A może coś mi brakuje?
weberste

3
Wydaje się, że to przydatne pytanie. Może to pytanie można przenieść na inną witrynę, która jest bardziej przyjazna dla tych pytań? Szukam najlepszych praktyk dotyczących zarządzania zależnościami C ++.
simgineer

Jest to opóźnienie około 10 lat, więc są tutaj 3 możliwości: niewłaściwie używasz, tracisz mavencały punkt mavenlub 10 lat temu, kiedy nie używałem mavenw C ++, było to znacznie mniej przydatne w C ++. Nie mogę mówić o 2009 roku, ale z doświadczenia z ostatnich lat mavenwynika , że jest to dokładnie to, czego użyłbyś do opisanego problemu. Robi dokładnie to, czego chcesz, całkiem skutecznie i dobrze, i nie robi tych negatywnych rzeczy, o których twierdzisz, że robi. Każdy, kto czyta to w 2019 lub później, powinien zdecydowanie rozważyć użycie mavenw tym celu.
Searchengine 27

Odpowiedzi:


37

Pierwsza odpowiedź : Sugerowałbym użycie CMake. Jest to wieloplatformowy generator plików make (generuje również projekty Visual Studio lub Eclipse CDT).

http://www.cmake.org/

Miałem z tym naprawdę dobre doświadczenia. Najbardziej podoba mi się możliwość tworzenia ogólnej struktury projektu. Możesz więc generalnie uwzględniać wyszukiwanie podprojektów pod kątem testów jednostkowych itp. Bez każdorazowej zmiany skryptu.

Mają również wiele modułów, w jaki sposób znaleźć wstępnie zainstalowane biblioteki kompilacji, wymagane dla projektu (takie jak Boost, QT itp.)


Aktualizacja : W międzyczasie próbowano wprowadzić zarządzanie pakietami dla C ++. Niektóre projekty, którym warto się przyjrzeć:

  • conan.io integruje się z głównymi narzędziami do kompilacji:
    • CMake
    • Visual Studio
    • Makefile
    • XCode
    • ...
  • cpm na podstawie CMake ( Uwaga: CPM nie jest aktywnie utrzymywany).
  • Buckaroo

Uwaga, jak wskazał @RAM w komentarzach, cpm nie jest już aktywnie utrzymywany.


7
Użyłem CMake kilka miesięcy temu i rzeczywiście, sprawdzanie wstępnie zainstalowanych bibliotek działało bardzo dobrze. Jednak innymi zależnościami binarnymi (tj. Tymi pochodzącymi z moich podprojektów) nie można było łatwo zarządzać. Czy coś mi brakuje?
weberste

3
@weberste, Właściwie nie ma takiego narzędzia jak maven dla C / C ++. Programiści próbują radzić sobie z zarządzaniem zależnościami za pomocą narzędzia podobnego do apt-get.
SunnyShah

1
cpm nie jest aktywnie utrzymywany i jest martwy od początku 2015 roku.
RAM

@RAM: dzięki za wskazanie tego. W poście dodałem notatkę odnoszącą się do Ciebie.
ovanes

2
CMake to system kompilacji z ograniczoną możliwością znajdowania zależności. To nie jest menedżer zależności w sensie NPM, Cargo itp.
sdgfsdh

17

Do zarządzania zależnościami istnieje nowy projekt (jest to firma startupowa) wdrażający tego typu narzędzie: https://github.com/biicode (menedżer zależności C ++). Możesz dodać swoje zależności i powinno działać.

Obecnie projekt nosi nazwę conan.io , zostały przejęte przez JFrog .

AKTUALIZACJA: Projekt jest martwy ... Niestety wydaje się, że startup nie mógł zdobyć wystarczającej liczby klientów płacących premium, ale serwer wydaje się działać dobrze ...

UPDATE2: Wygląda na to, że istnieje projekt zastępczy: conan.io (dzięki @mucaho)


Mogę usunąć link .. projekt został zamknięty, teraz jest conan.io
carlos.baez

Dziękuję za aktualizację! Głównie patrzę z ciekawości, wygląda na to, że nadal można pogrzebać na ich githubie w poszukiwaniu dokumentacji ; prawdopodobnie nie jest tak fajny, jak to, co było kiedyś na stronie, ale myślę, że to lepsze niż nic. Zastanawiam się tylko, czy conan.io to tylko rebranding, czy jest to zupełnie inny produkt?
jrh

1
Nie jest to rebranding, ale zupełnie nowy projekt od podstaw, z wszystkimi wyciągniętymi lekcjami: całkowicie open source, w pełni zdecentralizowany z własnym serwerem, obsługuje wszystkie systemy kompilacji, zarządza plikami binarnymi.
drodri

8

Polecam następujące systemy kompilacji wysokiego poziomu:


Wtyczka Maven Nar otrzymuje dobre wsparcie. Użyłem go i do tej pory mi się podoba. Jednak musisz zrozumieć, że Maven nie nadaje się do mono repo. Większość rozwiązań C ++ wymaga bibliotek współużytkowanych obsługujących repozytorium Mono i tym podobnych.
Hans,

5

Jeśli chcesz tylko zarządzania zależnościami, wypróbuj Ivy , ładnie integruje się z Ant (i zakładam, że NAnt może zrobić to samo na podstawie tego bloga , do którego link znajduje się na stronie Ivy).

Jest też Byldan , wersja Maven .Net. Nie wiem jednak, jak dobrze to zadziała.


3

Make i GCC to świetne połączenie do naprawdę dobrego sprawdzania zależności.

GCC może automatycznie generować pliki zależności „make” (przełącznik wiersza poleceń -MD), aby na przykład móc odbudować wszystkie pliki źródłowe zależne od danego nagłówka.

Mam kilka prostych zasad, które wycinam i wklejam do moich plików makefile:

# 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 $@

Teraz, jeśli twoje pliki obiektowe są zadeklarowane na przykład na liście OBJ_C i OBJ_CPP:

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

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

Make może oczywiście śledzić zależności z innymi projektami i tym podobne, np. Odbudować współdzieloną bibliotekę, jeśli jest to konieczne.

Na przykład, jeśli inne zespoły zawsze umieszczają swoje najnowsze biblioteki DLL w jakimś udostępnionym folderze:

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

zobacz mój komentarz dołączony do pytania dotyczącego moich obaw związanych z tym rozwiązaniem
weberste

Jeśli cel jest zależny od innego pliku, np. Plik wykonywalny jest zależny od biblioteki współdzielonej, możesz mieć regułę dla tej biblioteki współdzielonej, która zapewni, że twoja kopia biblioteki jest aktualna bez konieczności posiadania źródła, np. Po prostu pobierając najnowsza kopia z określonej lokalizacji lub z wykonania jakiejś aktualizacji kontroli wersji lub podobnej.
Will

${CC} ${CFLAGS} -c $< -MD -MF $(<:%.c=%.dep) -o $@Trudno mi było przeanalizować wszystkie te symbole Make, wygląda na to, że rozwiązuje się to na przykład, g++ -c main.cc -MD -MF testjeśli chcesz uruchomić go samodzielnie w wierszu poleceń, a wyniki umieszcza w pliku o nazwie „test”.
jrh


2

Polecam conan , z którego ostatnio korzystałem. Utrzymanie wszystkich zależnych bibliotek i plików binarnych w projekcie jest bardzo potężne.


1

Możesz utworzyć pakiet NuGet dla używanych bibliotek i użyć NuGet do zarządzania zależnościami.

Zobacz także NuGet dla C ++


1
NuGet to rozszerzenie programu Visual Studio
Toughy

@Toughy, może być również używany jako samodzielne zarządzanie zależnościami. (Plik wykonywalny 4M)
Yousha Aleayoub

0

Na SCons znajduje się wiele narzędzi, które zapewniają wyższą funkcjonalność podobną do tej z Autotools, które starają się ułatwić życie programistom (np. WAF, SNOCS). Niestety sam SCons ma poważną wadę - dłuższy czas kompilacji dla dużych projektów.

Mogę polecić wypróbowanie SNOCS (który jest odwróconym SCons) dla tych z Was, którzy szukają łatwego zarządzania zależnościami i wybrania opcji kompilacji w jednym poleceniu (kompilator, x86 / x64, Debug / Release, biblioteki statyczne / współdzielone, test / zainstalować cele itp.).

SNOCS próbuje również rozwiązać problem długiego czasu kompilacji, przechowując dane wyjściowe konfiguracji projektu w oddzielnych plikach, co pozwala kolejnym kompilacjom na całkowite pominięcie fazy konfiguracji i przejście bezpośrednio do fazy budowy (ostatnia funkcja jest teraz w budowie)

Konfiguracja CMake staje się uciążliwa w większych rozwiązaniach, więc konserwacja systemu kompilacji zajmuje dużą część czasu programisty. Na szczęście, jak wspomniał Martijn, istnieje biikod który „używa CMake do generowania projektu wraz z jego zależnościami”.


-1

Próbować SCons

SCons to narzędzie do tworzenia oprogramowania typu Open Source - to znaczy narzędzie do budowania nowej generacji. Pomyśl o SCons jako ulepszonym, wieloplatformowym zamienniku klasycznego narzędzia Make ze zintegrowaną funkcjonalnością podobną do autoconf / automake i pamięci podręcznych kompilatora, takich jak ccache. Krótko mówiąc, SCons to łatwiejszy, bardziej niezawodny i szybszy sposób tworzenia oprogramowania.


3
SCons nie ma żadnego wbudowanego zarządzania zależnościami ani repozytorium, jak ask.
Maxime Viargues

-3

Zalecam użycie matki wszystkich systemów zależności kompilacji: make.


Używam tego szeroko. GCC może sprawić, że pliki zależności, które „sprawiają”, mogą zjadać. Wystarczy na inną odpowiedź, może ...
Will

8
make jest właściwie tym, czego każdy chce uniknąć / wymienić, patrząc na kompilację -automację- systemy
chila

-6

Spróbuj babeczek, będziesz uzależniony. Marka jest przestarzała, trudna i droga w utrzymaniu.


Przyjrzałem się Sconsowi, ale nie znalazłem sposobu na zarządzanie zależnościami binarnymi. Masz na to przykład?
weberste

1
Ponieważ scons to python, możesz łatwo kodować wszystko, co chcesz, aby zarządzać zależnościami binarnymi. Być może pomoże również posiadanie „SConscript” w katalogu zależności binarnych. Nie jestem pewien, jakie są twoje trudne wymagania. Pedro.
piotr

16
Sugerujesz więc narzędzie oparte na „Nie jestem pewien, czego potrzebujesz, ale możesz zaprogramować je samodzielnie w Pythonie”. Dlaczego więc potrzebujesz scons?
jalf
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.