Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ _GLIBCXX\u是否在RHEL6和RHEL7上禁用了使用CXX11\u ABI?_C++_Libstdc++_Rhel7_Rhel6_Devtoolset - Fatal编程技术网

C++ _GLIBCXX\u是否在RHEL6和RHEL7上禁用了使用CXX11\u 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

我在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>
#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。您还需要确保链接器在与静态链接期间可以找到适当的stdlibde>-L

-Wl,-rpath,'$ORIGIN/../lib' -L/usr/local/sdk/llvm.6.0.1/lib
您需要链接到> -LSTDC++< /COD>和 > LSUPc++< /COD>(顺序是静态链接的重要),只要提供正确的库搜索路径,静态链接器应该找到GCC/GNU C++ STDLB和ABI支持库。 当心,如果您用此替换系统libstdc+,任何与旧ABI布局链接的程序如果动态链接,都会中断,因此请小心。有以下回复

Jakub Jelinek 2018-02-19 06:08:00美国东部时间

我们已经尽力了,但这是不可能的支持,无论是在任何情况下 RHEL6也不在RHEL7上,这就是它被强制禁用的原因。它将 在RHEL8中工作(也是默认的)


定义“未按预期工作”?请注意,
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