2010-01-19 17 views
13

Mam zamiar rozpocząć nowy projekt C++, który będzie opierał się na serii bibliotek, w tym części bibliotek Boost, log4cxx lub bibliotece logowania google - a jako projekt ewoluuje także inne (które nie mogę jeszcze przewidywać).Aplikacja C++ - czy powinienem używać bibliotek statycznych czy dynamicznych?

Będzie musiał działać zarówno w systemach 32-, jak i 64-bitowych, najprawdopodobniej w dość zróżnicowanym środowisku Linux, gdzie nie spodziewam się mieć wszystkich wymaganych bibliotek ani uprawnień.

Moje pytanie brzmi, czy powinienem zbudować aplikację przez dynamiczne lub statyczne połączenie z tymi bibliotekami?

Uwagi:

(1) Jestem świadomy statyczne powiązanie może być ból w trakcie rozwoju (już skompilować razy, cross-kompilacji zarówno dla 32- i 64-bit, schodząc łańcuchy zależnościami zawierać wszystkie biblioteki, etc), ale podczas testowania jest o wiele łatwiej - po prostu przenieś plik i uruchom.

(2) Z drugiej strony, dynamiczne łączenie szwów jest łatwiejsze podczas fazy projektowania - krótkie czasy kompilacji, (nie bardzo wiem, jak radzić sobie z łączeniem dynamicznym z bibliotekami 64-bitowymi z 32-bitowego środowiska dev), bez pośpiechu z łańcuchy zależności. Z drugiej strony wdrażanie nowych wersji może być brzydkie - zwłaszcza gdy wymagane są nowe biblioteki (zobacz powyższy warunek dotyczący braku uprawnień su na docelowych komputerach, ani tych bibliotek).

(3) Czytałem pokrewne pytania dotyczące tego tematu, ale nie mogłem określić, które podejście najlepiej pasuje do mojego scenariusza.

Wnioski:

  1. Dziękuję wszystkim za wkład!
  2. będę pewnie iść z linkami statyczny, ponieważ:
    • Łatwiejszy wdrażania
    • Przewidywalna wydajność i bardziej spójne wyniki podczas perf. testowanie (spójrz na ten dokument: http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • Jak wskazano, rozmiar i czas kompilacji statycznych a dynamika nie wydaje się być tak ogromną różnicą.
    • Łatwiejsze i szybsze cykle testowe
    • Mogę zatrzymać całe urządzenie. cykl na moim dev. Maszyna

Odpowiedz

11

Łączenie statyczne ma zły rap. W dzisiejszych czasach mamy ogromne dyski twarde i wyjątkowo grube rury. Wiele starych argumentów na rzecz dynamicznego łączenia jest teraz mniej ważne.

Co więcej, istnieje jeden naprawdę dobry powód, aby preferować statyczne łączenie w systemie Linux: Wiele konfiguracji platform sprawia, że ​​prawie niemożliwe jest zagwarantowanie, że twój plik wykonywalny będzie działał nawet na niewielkiej części bez łączenia statycznego.

Podejrzewam, że nie będzie to popularna opinia. W porządku. Mam jednak 11-letnie doświadczenie w wdrażaniu aplikacji na Linuksie i dopóki coś takiego jak LSB naprawdę nie wystartuje i naprawdę rozszerzy zasięg, Linux będzie nadal trudniej wdrażać aplikacje. Do tego czasu połącz statycznie aplikację, jeśli musisz korzystać z wielu różnych platform.

+3

Sprawia to, że po zainstalowaniu jest bardziej odporny. Jeśli użytkownik zainstaluje coś, co zmienia biblioteki dynamiczne, nie wpłynie to na twój program. – Jay

+0

Jednym z bardzo ważnych problemów z łączeniem statycznym (a także z dołączonymi bibliotekami) jest to, że konieczne aktualizacje zabezpieczeń są często pomijane. – wich

+0

Nie zauważyłem zauważalnej poprawy prędkości dzięki dynamicznemu łączeniu linuksa. Działaj statycznie - jest to łatwiejsze, a ślad pamięciowy dla Twojej aplikacji będzie mniejszy, o ile inny program nie uruchomi się w tym samym czasie z tą samą zależnością (biblioteki dynamiczne muszą zostać załadowane w całości do pamięci, nawet jeśli tylko użyj 1 funkcji). –

4

I prawdopodobnie używać dynamiczne łączenie w czasie (większość) rozwoju, a następnie zmienia się do łączenia statycznego dla końcowych fazach rozwoju oraz (wszystkie) wdrażania. Na szczęście niewiele potrzeba dodatkowego testowania przy przełączaniu z dynamicznego na statyczne połączenie bibliotek.

1

Najlepiej pozostawić to pakowaczowi i zapewnić obie opcje w skryptach configure/make. Zwykle połączenie dynamiczne miałoby pierwszeństwo, ponieważ wtedy byłoby łatwo uaktualnić biblioteki, gdy jest to konieczne, tj. Gdy wykryte zostaną luki w zabezpieczeniach itp.

Pamiętaj, że jeśli nie masz uprawnień roota do instalowania bibliotek w katalogach systemowych, możesz skompilować program tak, aby najpierw szukać gdziekolwiek potrzebnych bibliotek dynamicznych, jest to realizowane przez ustawienie dyrektywy runpath w plikach binarnych ELF. .Możesz określić taki katalog za pomocą opcji -rpath łącznika ld.

+0

Lub pozwolić osobie prowadzącej program na wskazanie, że powinna ona wyglądać w dodatkowych katalogach przy użyciu zmiennej środowiskowej LD_LIBRARY_PATH. – jamessan

2

To jest kolejne głosowanie na link statyczny. Nie zauważyłem znacząco dłuższych czasów łączenia dla aplikacji. Omawiana aplikacja to aplikacja konsolowa o rozmiarze ~ 50K, z wieloma bibliotekami skompilowanymi dla wielu zwykłych maszyn, głównie superkomputerów o 100-10 000 rdzeni. Dzięki łączu statycznemu wiesz dokładnie, z jakich bibliotek będziesz korzystać, możesz łatwo przetestować nowe wersje tych bibliotek.

W ten sposób powstaje większość aplikacji na komputery Mac. Umożliwia to po prostu skopiowanie katalogu do systemu.

Powiązane problemy