andreasbuhr / cppcoro

A library of C++ coroutine abstractions for the coroutines TS
MIT License
364 stars 53 forks source link

Clang/GCC incompatiblity #2

Open Garcia6l20 opened 4 years ago

Garcia6l20 commented 4 years ago

There are few problems with clang.

First, It is not able to find GCC headers, it is caused by -fcoroutines-ts and -fcoroutines does not define the same preprocessor definition, It can be workarounded with -D__cpp_impl_coroutine=1 (what -fcoroutines does).

And now, clang complains that a coroutine cannot be used without <experimental/coroutine> inclusion what is breaking with GCC.

eg.:

~/cppcoro/test/async_latch_tests.cpp:59:4: error: std::experimental::coroutine_traits type was not found; include <experimental/coroutine> before defining a coroutine
                        co_await latch;
                        ^

Currently the only way to use with clang is to use libc++ (tested with clang-12 on Arch):

cmake -DCMAKE_CXX_FLAGS="-stdlib=libc++" <path_to_sources>
Garcia6l20 commented 4 years ago

On ubuntu, executables must be explicitly linked with -lc++:

cmake -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-lc++" <path_to_sources>
andreasbuhr commented 4 years ago

Is this now solved with the latest changes in the integrate_all branch?

Garcia6l20 commented 4 years ago

No, it is not. Clang will only compile with libc++, but it should also work with libstdc++. This won't change until clang updates it's coroutine header to non-experimental path, or even accept it.

andreasbuhr commented 3 years ago

I guess this is solved in the master branch of andreasbuhr/cppcoro? I see that more documentation is required.

Garcia6l20 commented 3 years ago

The answer is simple can you build it with clang without --stdlib=libc++ ?