2012-04-27 21 views

Odpowiedz

6

Można użyć numeru g++ --version w połączeniu z the GCC ABI docs, aby się dowiedzieć.

49

Aby dowiedzieć się, jakie biblioteki jest używany można uruchomić

$ /sbin/ldconfig -p | grep stdc++ 
    libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6 

listy kompatybilnych wersjach dla libstdC++ wersja 3.4.0 i powyżej jest przez

$ strings /usr/lib/libstdc++.so.6 | grep LIBCXX 
GLIBCXX_3.4 
GLIBCXX_3.4.1 
GLIBCXX_3.4.2 
... 

We wcześniejszych wersjach symbol GLIBCPP definiuje.

data pieczęć biblioteki jest zdefiniowany w makro __GLIBCXX__ lub __GLIBCPP__ w zależności od wersji:

// libdatestamp.cxx 
#include <cstdio> 

int main(int argc, char* argv[]){ 
#ifdef __GLIBCPP__ 
    std::printf("GLIBCPP: %d\n",__GLIBCPP__); 
#endif 
#ifdef __GLIBCXX__ 
    std::printf("GLIBCXX: %d\n",__GLIBCXX__); 
#endif 
    return 0; 
} 

$ g++ libdatestamp.cxx -o libdatestamp 
$ ./libdatestamp 
GLIBCXX: 20101208 

Tabela datestamps z libstdc wersjach ++ jest wymieniony w documentation:

+8

W datestamps są niemal całkowicie bezużyteczny, nie wiem dlaczego przeszkadza im lub dokumentowanie utrzymanie im. Na przykład data GCC 4.6.3 jest późniejsza niż 4.7.0, ale 4.7.0 ma więcej funkcji, więc jaki jest pożytek z poznania daty wydania? –

14

Mechanizm ja zwykle używa się kombinacji readelf -V, aby zrzucić informacje o .gnu.version z libstdC++, a następnie tabelę odnośników, która dopasowuje największą wyodrębnioną wartość GLIBCXX_.

readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1 

jeśli wersja sort jest zbyt stary, aby mieć możliwość -V (który sortuje według numeru wersji), a następnie można użyć:

tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.' 

zamiast sort -u -V, sortowanie przez maksymalnie 4 cyfry wersji.

Ogólnie rzecz biorąc, dopasowanie wersji ABI powinno być wystarczająco dobre.

Jeśli starasz się wyśledzić libstdc++.so.<VERSION>, choć można użyć trochę bash jak:

file=/usr/lib/libstdc++.so.6 
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done 
echo ${file#*.so.} 

więc dla mojego systemu Dało 6.0.10.

Jeśli jednak próbujesz uzyskać plik binarny, który został skompilowany na systemX, aby działał na systemY, to tego typu rzeczy doprowadzą cię tylko do tej pory. W tych przypadkach, niosąc wraz z kopią libstdC++, tak aby był używany dla aplikacji, a następnie o skrypt uruchamiania, który robi an:.

export LD_LIBRARY_PATH=<directory of stashed libstdc++.so> 
exec application.bin "[email protected]" 

generalnie działa wokół kwestii .so, które znajduje się na box jest niezgodny z wersją z aplikacji. W przypadku bardziej ekstremalnych różnic w środowisku zwykle dodajemy wszystkie biblioteki zależne, dopóki aplikacja nie będzie działać poprawnie. Jest to odpowiednik linuksa, który obejmie to, co dla okien będzie uważane za piekło.

+0

Czy możesz użyć opcji "ident" lub "what" w pliku biblioteki, aby znaleźć informacje o wersji osadzonej? –

+0

'ident' ma luźny odpowiednik' strings -a | grep '\ $. * \ $' ',' co' używa odpowiednika 'strings -a | fgrep '@ (#)' ', z których żadna nie określa informacji o wersji biblioteki bazowej, jeśli te łańcuchy nie są skompilowane. Opieranie się na informacjach ABI ma dużo większy sens, jeśli próbujesz określić kompatybilność, ponieważ jest to generalnie gotowane do kompilacji, podczas gdy ident/jakie struny mają tendencję do pomijania – Petesh

10

Co dokładnie chcesz wiedzieć?

Nazwa udostępnionej biblioteki? To część nazwy pliku, libstdc++.so.6, lub pokazana przez readelf -d /usr/lib64/libstdc++.so.6 | grep soname.

Niewielki numer wersji? Powinieneś być w stanie uzyskać, że wystarczy zaznaczyć co punkty linku do:

$ ls -l /usr/lib/libstdc++.so.6 
lrwxrwxrwx. 1 root root 19 Mar 23 09:43 /usr/lib/libstdc++.so.6 -> libstdc++.so.6.0.16 

, który mówi, że to 6.0.16, który jest 16 rewizja wersji libstdc++.so.6, która odpowiada wersji GLIBCXX_3.4.16 symboli.

Czy masz na myśli wydanie, z którego pochodzi? To część GCC tak to ta sama wersja jak GCC, więc chyba, że ​​spieprzył swój system, instalując niedopasowane wersje g++ i libstdc++.so można dostać od:

$ g++ -dumpversion 
4.6.3 

lub, w większości dystrybucji, można po prostu spytaj menedżera pakietów. Na mój gospodarz Fedora to

$ rpm -q libstdc++ 
libstdc++-4.6.3-2.fc16.x86_64 
libstdc++-4.6.3-2.fc16.i686 

Jak inne odpowiedzi powiedział, można mapować uwolnień do wersji biblioteki poprzez sprawdzenie the ABI docs

Powiązane problemy