Linux 시스템에 설치된 libstdc ++ 라이브러리의 버전을 어떻게 찾습니까?
다음 명령을 찾았습니다. strings /usr/lib/libstdc++.so.6 | grep GLIBC
from here . 작동하는 것처럼 보이지만 이것은 임시 / 휴리스틱 방법입니다.
C ++ 라이브러리 버전을 쿼리하는 데 사용할 수있는 특정 명령이 있습니까? 아니면 내가 찾은 방법이 허용 된 방법입니까?
사용중인 라이브러리를 찾으려면 다음을 실행할 수 있습니다.
$ /sbin/ldconfig -p | grep stdc++
libstdc++.so.6 (libc6) => /usr/lib/libstdc++.so.6
libstdc ++ 버전 3.4.0 이상과 호환되는 버전 목록은 다음에서 제공합니다.
$ strings /usr/lib/libstdc++.so.6 | grep LIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
...
이전 버전의 경우 기호 GLIBCPP
가 정의되었습니다.
라이브러리의 날짜 스탬프는 매크로 __GLIBCXX__
또는 __GLIBCPP__
버전에 따라 정의됩니다 .
// 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
libstdc ++ 버전의 날짜 소인 표는 문서에 나열되어 있습니다 .
내가 사용하는 메커니즘 은 libstdc ++ readelf -V
에서 .gnu.version
정보 를 덤프 한 다음 GLIBCXX_
추출 된 가장 큰 값 과 일치하는 조회 테이블 의 조합입니다 .
readelf -sV /usr/lib/libstdc++.so.6 | sed -n 's/.*@@GLIBCXX_//p' | sort -u -V | tail -1
의 버전 sort
이 너무 오래되어 -V
옵션 (버전 번호별로 정렬)을 사용할 수없는 경우 다음을 사용할 수 있습니다.
tr '.' ' ' | sort -nu -t ' ' -k 1 -k 2 -k 3 -k 4 | tr ' ' '.'
대신 sort -u -V
최대 4 개의 버전 숫자로 정렬합니다.
일반적으로 ABI 버전을 일치 시키면 충분합니다.
그래도를 추적하려는 경우 다음 libstdc++.so.<VERSION>
과 같은 약간의 bash를 사용할 수 있습니다.
file=/usr/lib/libstdc++.so.6
while [ -h $file ]; do file=$(ls -l $file | sed -n 's/.*-> //p'); done
echo ${file#*.so.}
그래서 내 시스템의 경우 이것은 6.0.10
.
그러나 systemY에서 작업하기 위해 systemX에서 컴파일 된 바이너리를 얻으려는 경우 이러한 종류의 작업은 지금까지만 얻을 수 있습니다. 이 경우 응용 프로그램에 사용 된 libstdc ++. so의 복사본을 휴대하고 다음을 수행하는 스크립트를 실행합니다.
export LD_LIBRARY_PATH=<directory of stashed libstdc++.so>
exec application.bin "$@"
일반적으로 응용 프로그램의 버전과 호환되지 않는 상자에있는 .so 문제를 해결합니다. 환경의 극단적 인 차이를 위해 응용 프로그램이 제대로 작동 할 때까지 모든 종속 라이브러리를 추가하는 경향이 있습니다. 이것은 Windows의 경우 dll 지옥 으로 간주되는 작업을 수행하는 것과 동일한 Linux 입니다.
정확히 무엇을 알고 싶으십니까?
공유 라이브러리 soname? 이는 파일 이름의 일부 libstdc++.so.6
이거나으로 표시됩니다 readelf -d /usr/lib64/libstdc++.so.6 | grep soname
.
The minor revision number? You should be able to get that by simply checking what the symlink points to:
$ 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
That tells you it's 6.0.16, which is the 16th revision of the libstdc++.so.6
version, which corresponds to the GLIBCXX_3.4.16
symbol versions.
Or do you mean the release it comes from? It's part of GCC so it's the same version as GCC, so unless you've screwed up your system by installing unmatched versions of g++
and libstdc++.so
you can get that from:
$ g++ -dumpversion
4.6.3
Or, on most distros, you can just ask the package manager. On my Fedora host that's
$ rpm -q libstdc++
libstdc++-4.6.3-2.fc16.x86_64
libstdc++-4.6.3-2.fc16.i686
As other answers have said, you can map releases to library versions by checking the ABI docs
You could use g++ --version
in combination with the GCC ABI docs to find out.
'IT TIP' 카테고리의 다른 글
.NET-WindowStyle = 숨김 대 CreateNoWindow = true? (0) | 2020.11.27 |
---|---|
Html, Css 및 JavaScript를 사용하여 Android 애플리케이션 개발 (0) | 2020.11.27 |
Sublime Text 2에 패키지 설치 (0) | 2020.11.27 |
select2 동적으로 항목 변경 (0) | 2020.11.27 |
AngularJS 지시문 전달 문자열 (0) | 2020.11.27 |