C++ _GLIBCXX\u是否在RHEL6和RHEL7上禁用了使用CXX11\u ABI?
我在RHEL6和RHEL7上安装了gcc 5.2.1,看起来_GLIBCXX_USE_cx11_ABI被禁用了。即使我手动运行C++ _GLIBCXX\u是否在RHEL6和RHEL7上禁用了使用CXX11\u ABI?,c++,libstdc++,rhel7,rhel6,devtoolset,C++,Libstdc++,Rhel7,Rhel6,Devtoolset,我在RHEL6和RHEL7上安装了gcc 5.2.1,看起来_GLIBCXX_USE_cx11_ABI被禁用了。即使我手动运行-D\u GLIBCXX\u USE\u CXX11\u ABI=1-std=c++14,它也不起作用。这意味着我不会得到小字符串优化功能。例如,以下代码的输出总是有8和“micro not set”。对于SSO,若我们查看代码位/basic_string.h,std::string的大小应该至少为16。有解决办法吗 #include <string> #in
-D\u GLIBCXX\u USE\u CXX11\u ABI=1-std=c++14
,它也不起作用。这意味着我不会得到小字符串优化功能。例如,以下代码的输出总是有8和“micro not set”。对于SSO,若我们查看代码位/basic_string.h,std::string的大小应该至少为16。有解决办法吗
#include <string>
#include <iostream>
int main()
{
std::cout << sizeof(std::string) << std::endl;
#if _GLIBCXX_USE_CXX11_ABI
std::cout << "macro set" << std::endl;
#else
std::cout << "macro not set" << std::endl;
#endif
}
#包括
#包括
int main()
{
std::cout这取决于您的libstdc++
版本,请确保您的include/link/runtime路径正确。在您的系统中搜索该宏,然后使用该宏,只需确保链接到正确的stdlib/abi lib即可
如果没有,您可以自己构建它,但是请注意,如果您拥有的其他程序使用旧ABI,它们将无法与新的libstdc++
配合使用
编辑:考虑到这一点,您是否为g++
指定了正确的-std=
标志?您是否尝试过-std=gnu11
?这可能很简单。如果没有,请继续阅读。不要手动指定该定义,您将破坏与libstdc++
的ABI兼容性,从而导致精彩的级联崩溃。只有在自己构建stdlib时才能指定类似的内容
剩下的部分有点过头了,但它解释了如何构建和/或选择要使用的stdlib
在使用libc++
的版本2 ABI时,我也遇到了类似的问题,其中所有与之相关的链接都必须使用正确的头来重建,从而使用正确的ABI(小字符串优化就是其中之一)
例如,在构建C++对象时,我使用以下标志来指定一个自定义STDLIB头路径的位置,而不是使用OS提供的一个路径(我使用Clang,但原理类似):
然后,在链接阶段,我使用$ORIGIN
相对运行时搜索路径,因为在生产机器上,标准库安装在一个更合理的位置,但是您可以指定一个固定的stdlib,以选择您想要的stdlib。您还需要确保链接器在与-Wl,-rpath,'$ORIGIN/../lib' -L/usr/local/sdk/llvm.6.0.1/lib
您需要链接到定义“未按预期工作”?请注意,
1
是该宏的默认值。您是从哪里安装GCC的?GCC是全公司范围的。假设它是RHEL发行版的一部分。您使用的是不支持新ABI的devtoolset版本的GCC。我将更改问题上的标记以明确这一点,因为这是您看到的行为的原因。但是我的“宏集”代码应该与libstdc++无关,对吧?试过了g++-D\u GLIBCXX\u USE\u cx11\u ABI=1-std=c++14
g++-D\u GLIBCXX\u USE\u cx11\u ABI=1-std=gnu++14
和“-D”。我们的测试打印“宏未设置”。标题(至少在libc++
)公开ABI细节,比如结构布局,通过改变它们并与它们一起构建,本质上是链接到一个不兼容的STDLIB,因为它不是头文件,它有很多编译的部分,它们期望布局是相同的。你可以自己构建STDLIB,但是你会破坏与AcAI链接的每个C++共享对象的ABI COMPATE。nst操作系统stdlib。这个答案相当误导。没有-std
选项会更改ABI,并且libstdc++中的新ABI不会使所有对象和库不兼容,这就是库SONAME没有更改的原因。有关更多详细信息,请参阅。
-Wl,-rpath,'$ORIGIN/../lib' -L/usr/local/sdk/llvm.6.0.1/lib