alibaba / havenask

Apache License 2.0
1.6k stars 302 forks source link

c++20的coroutine是强依赖吗 #172

Open icexin opened 1 year ago

icexin commented 1 year ago

现在c++20在业界还没有完全使用起来,强制依赖c++20可能有些激进,请问有没有开关能关掉这些特性,从而能用低于c++20的编译器编译。

谢谢!

icexin commented 1 year ago

没有人回复吗?future_lite里面的use_coro开关好像没用

xuxijie commented 1 year ago

我check下,看看是否可以关掉,但是现在我们编译都是用提供的编译镜像编译的,如果替换了c++版本,不知道是否会有其他坑

xuxijie commented 1 year ago

代码编译默认的应该是C++17,确实有些协成用到了c++20,但是这些默认是关闭的,你编译过程中有发现哪部分代码用到了c++20吗?贴出来我们处理一下。

icexin commented 1 year ago

Config.h文件里面的coroutine已经关掉了,编译器开关的-fcoroutines没有打开

$ cat Config.h 

#ifndef FUTURE_LITE_CONFIG_H
#define FUTURE_LITE_CONFIG_H

#define FUTURE_LITE_NOT_USE_COROUTINES 1

#endif

然后编译就报错了,其中一个地方是这样的:

bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/Traits.h:46:84: error: unknown type name 'co_await'
    static int8_t test(std::remove_reference_t<decltype(std::declval<C>().operator co_await())>*);
                                                                                   ^
bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/Traits.h:56:66: error: unknown type name 'co_await'
    static int8_t test(std::remove_reference_t<decltype(operator co_await( std::declval<C>()))>*);
                                                                 ^
bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/Traits.h:66:56: error: unknown type name 'co_await'
    return std::forward<Awaitable>(awaitable).operator co_await();
                                                       ^
bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/Traits.h:72:21: error: unknown type name 'co_await'
    return operator co_await(std::forward<Awaitable>(awaitable));
                    ^
In file included from external/havenask~override/aios/storage/indexlib/index/inverted_index/truncate/TruncateMetaFileReaderCreator.cpp:20:
In file included from bazel-out/k8-fastbuild/bin/external/havenask~override/aios/storage/indexlib/file_system/file/_virtual_includes/interface/indexlib/file_system/file/FileReader.h:28:
In file included from bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/Lazy.h:28:
bazel-out/k8-fastbuild/bin/external/havenask~override/aios/future_lite/_virtual_includes/future_lite_base/future_lite/coro/CoAwait.h:89:48: error: use of undeclared identifier 'co_return'; did you mean 'return'?
    static ViaCoroutine create(Executor* ex) { co_return; }
                                               ^~~~~~~~~
                                               return
xuxijie commented 1 year ago

你编译的命令发一下,是直接执行的build.sh吗?

icexin commented 1 year ago

我换了一个镜像,里面是clang8,编译命令是 bazel build --config clang //aios/apps/facility/build_service:bs_local_job

xuxijie commented 1 year ago

你在加上 --config=havenask 试试

icexin commented 1 year ago

在你们提供的镜像里面--config=havenask是ok的,这个没有问题。我的意思是co_await这些在c++20里面才有的关键字不能通过开关开启或者关闭吗?

xuxijie commented 1 year ago

在你的镜像里面加上这个配置也有问题吗?

icexin commented 1 year ago

如果不用clang用gcc,会直接报gcc: error: unrecognized command line option '-fcoroutines',我的gcc是9.4.0

xuxijie commented 1 year ago

对应的Havenask是哪个版本,1.0.0吗?

icexin commented 1 year ago

master

xuxijie commented 1 year ago

代码里面我看使用clang编译会强制指定使用c++20,目前不建议使用clange编译,你看下我们的编译镜像里面的gcc和你的有什么差别

icexin commented 1 year ago

你们镜像里面的gcc版本是10.2.1

icexin commented 1 year ago

代码里面我看使用clang编译会强制指定使用c++20,目前不建议使用clange编译

我们这边的主要编译器是clang,这个会修吗?

xuxijie commented 1 year ago

这个目前还没有计划修,你将代码跟目录下的.bazelrc文件里面的build --define indexlib_coroutine=yes 去掉试试

icexin commented 1 year ago

这个目前还没有计划修,你将代码跟目录下的.bazelrc文件里面的build --define indexlib_coroutine=yes 去掉试试

这个试过了,没有效果,我看代码里面使用co_await是hard code的。