如何判断一个库是使用C++11编译的

8

如何确定某个C++库是否使用了 C++11 标准链接?


我之所以问这个问题,是因为在构建MongoDB C++遗留驱动程序时,必须确保现有的Boost使用与MongoDB驱动程序相同的C++标准——即C++11。 - kroiz
我不确定如何得到你想要的东西,但有一种方法可以找到编译器的版本。(https://dev59.com/_nE95IYBdhLWcg3wQ7qc)。你可以创建一个最低编译器版本要求列表,并基本实现它。但是,如果在编译时使用了“-std=c++11”,目前还没有答案。 - badola
请仅返回翻译后的文本:这里指的不是编译器版本,而是编译时是否使用了C++11标志。 - kroiz
1
“必须确保现有的boost是使用相同的C++标准构建的” - 不一定......没有标准规定ABI中断,所以这取决于您使用的特定编译器版本 - 以及您指定的任何标志 - 是否具有中断。如果我是你,我会尝试一下,看看是否有效。我肯定会将使用和不使用-std=c++11的对象混合编译 - 但所有都是使用相同的编译器版本 - 与boost链接,并且没有出现问题。 - Tony Delroy
我怎么知道它是否有效?初始化库足够还是需要全面覆盖?此外,在mongo-cxx-driver维基中有一条评论说ubuntu上的boost包没有使用C++11,我认为这是错误的,我想向维护者证明它是错误的,以便他修复维基,因为这会误导开发人员使用错误的构建标志并花费数小时来找出问题所在。对我来说,只有当我使用C++11标志构建mongo-cxx-driver时,mongo-cxx-driver才开始工作,但这可能是偶然的,对吧? - kroiz
显示剩余2条评论
1个回答

3

默认情况下,Elf二进制文件将包含所使用编译器版本的签名。

关于所使用的编译器标志,如果在编译时使用了-frecord-gcc-switches,则可以在Elf可执行文件中找到该签名。

 g++ -frecord-gcc-switches -std=c++0x trial.cpp
readelf -p .GCC.command.line a.out

“.GCC.command.line”部分的字符串转储:

  [     0]  -imultilib . [     d]  -imultiarch x86_64-linux-gnu   [    2a]  -D_GNU_SOURCE   [ 38]  trial.cpp   [    42]  -mtune=generic   [    51]  -march=x86-64  [    5f]  -std=c++0x   [    6a]  -frecord-gcc-switches   [    80]   
-fstack-protector

请问我该如何获取那个字符串转储? - kroiz
使用hexedit工具查看libboost_system.so.1.54.0文件,我得到的结果是:ibboost_system.so.1.54.0.GCC_3.0.GLIBC_2.4.GLIBC_2.2.5.GLIBCXX_3.4.CXXABI_1.3 也许ABI版本号可以帮助确定boost和mongo驱动程序之间的兼容性。 - kroiz
2
读取elf -p .GCC.command.line a.out命令,可以给你字符串转储。 - basav
1
您也可以使用字符串工具...字符串 a.out|grep "xyz" - basav
1
这些都没有结果,我猜想我所拥有的boost包并没有使用-frecord-gcc-switches进行编译。 - kroiz
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接