微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

_GLIBCXX_USE_CXX11_ABI,兼容GCC 4.8和ABI

我们收到了一些为Linux编译的库(.a)(可能使用GCC 6.x编译)。

我们正在使用GCC 4.8,我们得到的types的错误: undefined reference to std::__cxx11::basic_string当试图链接

通常这可以通过确保所有的单元已经用相同的_GLIBCXX_USE_CXX11_ABI标志编译来解决。 但是,如果我理解正确,这是由GCC 5.1和。

有没有办法让这个工作与海湾合作委员会4.8或我们需要问人们用不同的_GLIBCXX_USE_CXX11_ABI重新编译库?

我猜如果我们能够切换到GCC> 5.1,我们可以做这个工作?

谢谢!

创build一个没有警告的位图

为什么描述snmp oid给“null”?

如何更改由Shell_NotifyIcon设置的systray图标文本样式

除了POSIX定时器,Linux中的其他定时器API还有哪些?

Linux C:类似shell的环境 – 个别执行 – C命令? (C口译员)

如何使C#应用程序充当服务?

如何正确使用文件映射并将数据传递给subprocess?

“bash:./a.out:'ld`运行的可执行文件上没有这样的文件或目录

Windowslogin的多重身份validation

C ++共享库未定义引用'FooClass :: SayHello()'

可以使用C ++ 11 ABI和gcc 4.8.2,但这是一个危险的黑客行为; 如果可能的话,要求供应商发布使用C ++ 03 ABI( -D_GLIBCXX_USE_CXX11_ABI=0 )编译的库或者升级到GCC 5或更高版本,您将会变得更好。

您需要下载并安装gcc 5,以便您可以使用它的libstdc ++头文件和库,然后直接使用gcc 4.8来优先使用它们。 另外,因为gcc 4.8缺少gcc 5附带的libstdc ++所需的一些内在函数,所以你需要破解它们的用法

例如,编译一个包含<string>的简单单文件应用程序:

/usr/local/gcc-4.8.2/bin/g++ -std=c++11 -D_GLIBCXX_USE_CXX11_ABI=1 -D'__is_trivially_copyable(...)=0' -D'__is_trivially_constructible(...)=0' -D'__is_trivially_assignable(...)=0' -nostdinc++ -isystem /usr/local/gcc-5.4.0/include/c++/5.4.0/ -isystem /usr/local/gcc-5.4.0/include/c++/5.4.0/x86_64-unkNown-linux-gnu -L /usr/local/gcc-5.4.0/lib64 a.cpp

这是很危险的,因为gcc 5.4 libstdc ++没有被设计为使用gcc 4.8,重新定义使用的内在函数( __is_trivially_copyable等)可能会改变结构的布局,否则会导致程序和供应商库之间的二进制不兼容。

为了运行生成的可执行文件,还需要确保动态链接程序找到一个兼容的libstdc ++,例如在/etc/ld.so.conf添加/usr/local/gcc-5.4.0/lib64 ,或者使用-Wl,-rpath /usr/local/gcc-5.4.0/lib64 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐