be main 分支编译报错

【详述】问题详细描述
SR be main 分支编译报错

[ 99%] Building CXX object src/service/CMakeFiles/starrocks_be.dir/starrocks_main.cpp.o
/root/tmp/starrocks/be/src/service/starrocks_main.cpp:74:2: error: #error _GLIBCXX_USE_CXX11_ABI must be non-zero
74 | #error _GLIBCXX_USE_CXX11_ABI must be non-zero
| ^~~~~
make[2]: *** [src/service/CMakeFiles/starrocks_be.dir/build.make:76: src/service/CMakeFiles/starrocks_be.dir/starrocks_main.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:1143: src/service/CMakeFiles/starrocks_be.dir/all] Error 2

系统: centos 7
gcc version: gcc (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11)

请问如何设置 _GLIBCXX_USE_CXX11_ABI 这个参数呢?

去掉https://github.com/StarRocks/starrocks/pull/17223 这个pr 的代码能正常编译通过

gcc -v 2>&1
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-10/root/usr/libexec/gcc/x86_64-redhat-linux/10/lto-wrapper
Target: x86_64-redhat-linux
Configured with: …/configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-10/root/usr --mandir=/opt/rh/devtoolset-10/root/usr/share/man --infodir=/opt/rh/devtoolset-10/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --with-default-libstdcxx-abi=gcc4-compatible --enable-plugin --enable-initfini-array --with-isl=/builddir/build/BUILD/gcc-10.2.1-20210130/obj-x86_64-redhat-linux/isl-install --disable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.1 20210130 (Red Hat 10.2.1-11) (GCC)

看了下是 redhat 的gcc 默认设置了–with-default-libstdcxx-abi=gcc4-compatible 这个参数,导致 _GLIBCXX_USE_CXX11_ABI 这个值默认为0

在机器上编译了一下gcc 10.3.0 , 然后替换掉默认的就能正常编译了,不用 devtoolset-10 里面的gcc

遇到了同样的错误,想问下为什么需要重新编译gcc 10呢?devtoolset-10 gcc 指定了–with-default-libstdcxx-abi=gcc4-compatible,这样会有什么问题吗?


这个pr引入的对_GLIBCXX_USE_CXX11_ABI宏的检查

std::list::size before gcc5 traverses the whole list, which is not thread-safe.

如果gcc是带了参数–with-default-libstdcxx-abi=gcc4-compatible编译的,只是表示和gcc4 abi兼容吧,会导致std::list::size也是非线程安全的实现吗?是不是这里判断gcc版本就可以了,为什么要用_GLIBCXX_USE_CXX11_ABI来判断呢?

这样生成的abi与cxx11的不兼容, 其它预编译的库大多用cxx11 abi, 虽然可以编译过, 最终link还是会失败.

所以代码里也有强制检查CXX11_ABI=1, 将错误提早发现.

如果thirdparty也是同样的gcc编译的会有问题吗?我临时去掉了starrocks_main的检查,没有link错误。还是说运行时会有问题?