你如何find你的linux机器上安装了什么版本的libstdc ++库?

我发现了以下命令: strings /usr/lib/libstdc++.so.6 | grep GLIBC 从这里 strings /usr/lib/libstdc++.so.6 | grep GLIBC 。 它似乎工作,但这是一个特设/启发式的方法。

有没有一个特定的命令可以用来查询库的C ++版本? 或者是我find了接受方法的方法?

要find正在使用哪个库,你可以运行

  $ /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被定义。

库的date标记在macros__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 ++版本的date戳记表:

我倾向于使用的机制是readelf -V的组合,以从libstdc ++转储.gnu.version信息,然后查找与提取的最大GLIBCXX_值匹配的表。

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

如果您的sort版本太旧,无法使用-V选项(按版本号sorting),那么您可以使用:

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

而不是sort -u -V ,最多可以sorting4个版本的数字。

一般来说,匹配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

但是,如果你想获得一个在systemX上编译的二进制文件,在systemY上工作,那么这些types的东西只会帮你达到目的。 在这些情况下,携带libstdc ++。的副本,以便用于应用程序,然后运行脚本来执行:

 export LD_LIBRARY_PATH=<directory of stashed libstdc++.so> exec application.bin "$@" 

通常围绕.so的问题,即与应用程序的版本不兼容。 对于更多的环境差异,我倾向于只添加所有的依赖库,直到应用程序正常工作。 这是linux的等价物,对于windows来说,会被认为是地狱

你想知道什么?

共享库soname? 这是文件名libstdc++.so.6的一部分,或由readelf -d /usr/lib64/libstdc++.so.6 | grep soname readelf -d /usr/lib64/libstdc++.so.6 | grep soname

小修订号? 您应该能够通过简单地检查符号链接指向的内容来获取:

 $ 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 

这告诉你它是6.0.16,这是libstdc++.so.6版本的第16版本,它对应于GLIBCXX_3.4.16符号版本。

或者你的意思是它的来源? 它是GCC的一部分,所以它与GCC是同一个版本,所以除非你通过安装无与伦比的g++libstdc++.so版本来搞砸你的系统, libstdc++.so你可以从这里得到:

 $ g++ -dumpversion 4.6.3 

或者,在大多数发行版上,你可以问包pipe理员。 在我的Fedora主机上

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

正如其他答案所述,您可以通过检查ABI文档将发布映射到库版本

您可以将g++ --version与GCC ABI文档结合使用来查找。