2012-10-18 12 views
19

Próbuję utworzyć bibliotekę C++ w Xcode i nie jestem pewien, czy wybrać bibliotekę C/C++ czy STL C++ Library? Zauważyłem, że opcja STL C++ Library nie pozwala na utworzenie biblioteki statycznej i zmusza do utworzenia biblioteki dynamicznej. Jednak opcja C/C++ Library umożliwia tworzenie biblioteki dynamicznej oprócz tworzenia biblioteki statycznej.Jaka jest różnica między biblioteką C/C++ a biblioteką STL C++ w XCode?

Jaka jest różnica między tymi dwiema opcjami i kiedy należy ich użyć? Czytam opisy poniżej opcji, ale niestety nie są one strasznie pomocne.

Inna uwaga: dlaczego plik biblioteki statycznej jest inny niż plik biblioteki dynamicznej? Wydaje się, że różnica polega przede wszystkim na tym, jak biblioteka jest znaleziona (w pakiecie z aplikacją, a nie na obecności na komputerze docelowym), a nie na funkcjonowaniu czy kodzie samej biblioteki. Byłoby wspaniale, gdyby ktoś mógł to wyjaśnić.

enter image description here

enter image description here

+0

libC++ vs libstdC++ może? – Praetorian

Odpowiedz

17

statycznie połączone biblioteki nie mogą być ładowane w czasie wykonywania, ale muszą być włączone do pliku binarnego, gdy odwołuje się plik wykonywalny. Oznacza to, że wszystkie punkty wejścia do kodu w statycznie połączonej bibliotece są dobrze zdefiniowane, a ich adresy nie zmienią się w stosunku do początku kodu wykonywalnego (czyli "statycznego").

Przy dynamicznie ładowanych bibliotekach nie ma możliwości sprawdzenia, gdzie będzie kod, więc gdy biblioteka jest ładowana w czasie wykonywania, pewien nakład pracy związany z wydajnością jest niezbędny do "związania" załadowanego kodu. Zasadniczo, łączenie jest przenoszone do czasu działania, dlatego też jest czasami określane jako "późne wiązanie".

Które z poniższych ustawień chcesz zastosować, zależy od wymagań użytkownika. Jeśli potrzebujesz samodzielnego pliku wykonywalnego, który użytkownik może po prostu przeciągnąć i upuścić do swojego folderu aplikacji, nie martwiąc się o zależności, to statyczne połączenie bibliotek może być dobrym sposobem.

Jednak w przypadku większych skalowanych projektów, w aplikacjach, które zapewniają mnóstwo funkcji, może być zaporą i niepotrzebne ładowanie wszystkich funkcji naraz. Zapewnienie zestawu dynamicznie ładowanych bibliotek może zarówno oszczędzać pamięć, jak i skracać czas uruchamiania. Następnie, gdy użytkownik uzyskuje dostęp do funkcji, ładowany jest odpowiedni kod i ewentualnie funkcje, które nie były używane przez jakiś czas, mogą zostać rozładowane.

Dodatkowo, jeśli wprowadzisz zmiany w kodzie, możesz po prostu redystrybuować jedną lub dwie biblioteki, zamiast ponownej kompilacji i ponownego połączenia i ponownego rozpowszechnienia całego pliku wykonywalnego. Czy muszę wspomnieć o perspektywie wtyczek?

Różnice między dwoma powyższymi szablonami są subtelne. Obie kompilują C zgodnie ze standardem GNU99. Ale szablon C/C++ Library ustawia xcode do kompilacji C++ zgodnie ze standardem "C++/GNU ++ 0x". C++/GNU ++ 0x został później oficjalnie opublikowany jako C++/GNU ++ 11 w 2011 roku. Oba szablony domyślnie używają biblioteki libC++, ale szablon STL C++ pozwala ci wybrać link do starszej biblioteki libstdC++. Dlaczego miałbyś to zrobić? Jeśli twój kod łączy się z libC++, ale łączysz się także z innymi bibliotekami, które odwołują się do libstdC++, i masz do czynienia z konfliktowymi symbolami, możesz rozwiązać ten problem przez połączenie z libstdC++. Szablon biblioteki STL C++ Library pozwala również zażądać, aby kompilator przylgnął do standardu C++ 11, z wyłączeniem rozszerzeń GNU ++ 11, lub wrócić do C++/GNU ++ 98 (jeśli potrzebujesz skompilować starszy kod, dla przykład).

Powiązane problemy