【问题标题】:How to tell a library was compiled using C++11如何判断库是使用 C++11 编译的
【发布时间】:2016-01-29 04:03:09
【问题描述】:

如何判断某个 c++ 库是否使用 c++11标准?

【问题讨论】:

  • 我问是因为在构建 mongodb C++ 旧版驱动程序时,必须确保现有的 boost 是使用与 mongodb 驱动程序相同的 C++ 标准构建的 - 即 C++11
  • 那么,您想知道编译器版本是用什么编译器版本构建的二进制文件??
  • 我不知道如何得到你想要的,但是有一种方法可以找到编译器的版本。 (stackoverflow.com/questions/2387040/…)。您可以创建所需的最低编译器版本列表,然后实现这一目标。但同样,如果在编译时使用了 -std=c++11,目前还没有得到答复。
  • 不是 g++ 4.4 还是 g++ 4 中的编译器版本,而是使用 C++11 的标志完成的编译。
  • “必须确保现有的 boost 是使用相同的 C++ 标准构建的” - 不一定……ABI 中没有标准规定的中断,所以它仅取决于您使用的特定版本的编译器 - 使用您指定的任何标志 - 是否有中断。如果我是你,我会尝试一下,看看它是否有效。我当然链接了使用和不使用 -std=c++11 编译的混合对象 - 但都使用相同的编译器版本 - 针对 boost 并且没有发现任何问题。

标签: c++ c++11 shared-libraries


【解决方案1】:

默认情况下,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

【讨论】:

  • 请问如何获取该字符串转储?
  • 在 libboost_system.so.1.54.0 上使用 hexedit 我得到: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 驱动程序之间的兼容性。
  • readelf -p .GCC.command.line a.out..这应该给你字符串转储
  • 你也可以使用字符串工具...strings a.out|grep "xyz"
  • 这些没有产生任何结果,我猜我拥有的 boost 包不是使用 -frecord-gcc-switches 编译的。
猜你喜欢
  • 2017-02-08
  • 2011-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
相关资源
最近更新 更多