Czy powinienem używać libc ++ czy libstdc ++? [Zamknięte]
91
Rozwijam pliki wykonywalne interfejsu wiersza poleceń zarówno dla OSX, jak i Linux przy użyciu C / C ++. Projekt będzie łączył się z opencv. Czy powinienem używać libc ++ czy libstdc ++?
Używałbym natywnej biblioteki dla każdego systemu operacyjnego, tj. Libstdc ++ w systemie GNU / Linux i libc ++ w systemie Mac OS X.
libc ++ nie jest w 100% kompletne w systemie GNU / Linux i nie ma żadnych korzyści z używania go, gdy libstdc ++ jest bardziej kompletne. Ponadto, jeśli chcesz połączyć się z innymi bibliotekami napisanymi w C ++, prawie na pewno zostaną one zbudowane za pomocą libstdc ++, więc będziesz musiał również połączyć się z nimi, aby z nich korzystać.
Więcej informacji tutaj o kompletności libc ++ na różnych platformach.
Czy możesz rozwinąć / podać linki dotyczące stanu kompletności libc ++ w systemie Linux? Nie bardzo rozumiem, dlaczego miałoby to być specyficzne dla platformy, ponieważ libc ++ to tylko zbiór nagłówków biblioteki standardowej. Czy masz na myśli, że trzeba zbudować biblioteki uruchomieniowe Clang wrt do LLVM, które nie są dobrze obsługiwane w systemie Linux?
TemplateRex
1
@TemplateRex, nie znam aktualnego statusu, możesz zajrzeć na libcxx.llvm.org . Nie śledzę libc ++, więc pytasz niewłaściwą osobę, ale czy sugerujesz, że „zbiór nagłówków biblioteki standardowej” nigdy nie będzie zawierał kodu specyficznego dla platformy?
Jonathan Wakely
Ponieważ możesz zainstalować Linuksa na prawie tym samym sprzęcie Apple, na którym działa Mac OS X, zastanawiam się, skąd pochodzi zależność platformy w nagłówkach C ++? Być może niektóre opakowania wokół wbudowanych elementów procesora lub operacji we / wy i obsługi wyjątków są zależne od systemu, ale rozumiem, że takie rzeczy są obsługiwane w warstwach binarnych typu librcxxrt. Czy nagłówki Biblioteki standardowej nie powinny być w mniejszym lub większym stopniu dające się podłączyć?
TemplateRex
4
Nie mówię o sprzęcie. Ponownie, nie mam pojęcia o libc ++, ale większość standardowych bibliotek C ++ jest zaimplementowanych w bibliotece C systemu operacyjnego i np. Mapowanie std::ctype_base::maskwartości na <ctype.h>stałe jest całkowicie zależne od platformy. (Funkcje wewnętrzne procesora są dostarczane przez kompilator, obsługa wyjątków jest wykonywana przez niskopoziomową warstwę ABI, ale operacje wejścia / wyjścia są zwykle wykonywane w całości w bibliotekach C ++ i C, a nie w elementach niskiego poziomu).
Jonathan Wakely
1
@abergmeier, to fałszywy argument, ponieważ (gdy jest używany z GCC lub innymi odpowiednimi procesami kompilacji) libstdc ++ nie nakłada żadnych ograniczeń na kod, który go używa, niezależnie od tego, czy jest on połączony dynamicznie czy statycznie. To nie jest LGPL. Proszę, nie rozprzestrzeniaj FUD. gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.what
Jonathan
30
Główne dystrybucje Linuksa nie zapewniają LLVM libc ++, ponieważ:
W przeciwieństwie do Apple i FreeBSD, GPL + 3 nie stanowi problemu, więc nie ma potrzeby implementowania tutaj kolejnego stosu.
Komponenty Linuksa były rozwijane od wieków wokół GNU libstd ++. Niektóre z nich nie opierają się na niczym innym.
Chociaż libc ++ jest mocne w nowych funkcjach, ma pewne problemy ze starszym kodem.
Jeśli ostatecznie libc ++ stanie się częścią dystrybucji, będzie opcjonalnym komponentem. tworzenie linków do niego będzie prawdopodobnie wymagało dodatkowych opcji.
Jak powiedział Jonathan, powinieneś używać dowolnego narzędzia, które jest domyślnie dołączone. Clang jest bezpieczny w użyciu w Linuksie, ponieważ jest skonfigurowany jako zamiennik GCC, więc w tym aspekcie nie musisz się martwić o 2 kompilatory. Ponieważ celujesz w dwie platformy, powinieneś przyjrzeć się cmake.
Clang nie zastępuje GCC ... Po prostu kolejny kompilator.
Isaac Pascual
4
@IsaacPascual Mario miał na myśli to, że clang oficjalnie ma w swoich celach projektowych być bezpośrednim zamiennikiem dla czołowego kompilatora na platformie, na której go uruchamiasz (np. Gcc, gdy jest uruchamiany na Linuksie). To samo dotyczy kompilatora firmy Intel afaik. To ich sposób na szersze zastosowanie.
Odpowiedzi:
Używałbym natywnej biblioteki dla każdego systemu operacyjnego, tj. Libstdc ++ w systemie GNU / Linux i libc ++ w systemie Mac OS X.
libc ++ nie jest w 100% kompletne w systemie GNU / Linux i nie ma żadnych korzyści z używania go, gdy libstdc ++ jest bardziej kompletne. Ponadto, jeśli chcesz połączyć się z innymi bibliotekami napisanymi w C ++, prawie na pewno zostaną one zbudowane za pomocą libstdc ++, więc będziesz musiał również połączyć się z nimi, aby z nich korzystać.
Więcej informacji tutaj o kompletności libc ++ na różnych platformach.
źródło
std::ctype_base::mask
wartości na<ctype.h>
stałe jest całkowicie zależne od platformy. (Funkcje wewnętrzne procesora są dostarczane przez kompilator, obsługa wyjątków jest wykonywana przez niskopoziomową warstwę ABI, ale operacje wejścia / wyjścia są zwykle wykonywane w całości w bibliotekach C ++ i C, a nie w elementach niskiego poziomu).Główne dystrybucje Linuksa nie zapewniają LLVM libc ++, ponieważ:
Jeśli ostatecznie libc ++ stanie się częścią dystrybucji, będzie opcjonalnym komponentem. tworzenie linków do niego będzie prawdopodobnie wymagało dodatkowych opcji.
Jak powiedział Jonathan, powinieneś używać dowolnego narzędzia, które jest domyślnie dołączone. Clang jest bezpieczny w użyciu w Linuksie, ponieważ jest skonfigurowany jako zamiennik GCC, więc w tym aspekcie nie musisz się martwić o 2 kompilatory. Ponieważ celujesz w dwie platformy, powinieneś przyjrzeć się cmake.
źródło