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:
- Dziękuję wszystkim za wkład!
- 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
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
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
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). –