boostorg / boostorg/cobalt

Failure to compile cobalt channel in templated code.

Ouverte
#263 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
C++
Étoiles
347
Forks
47
Merge moyen
3 j 8 h
PR mergées (30 j)
1

Description

I'm trying to use cobalt in conjunction with open62451pp to make calling asynchronous function more linear.

I've implemented a template like such:

```cpp
template
struct AsyncResult {

template
static auto initiate(Initiation&& initiation, UseCobaltToken, Args&&... args) -> boost::cobalt::task {

auto ex = co_await boost::cobalt::this_coro::executor;

auto channel = boost::cobalt::channel(1u, ex);

auto callback = [&channel, ex](auto&& res) mutable {
boost::cobalt::spawn(ex,
[](auto& chan, auto response) mutable -> boost::cobalt::task {
co_await chan.write(std::move(response));
}(channel, std::forward(res)),
boost::asio::detached
);
};

std::invoke(std::forward(initiation), std::move(callback), std::forward(args)...);

co_return co_await channel.read();
}
};
```
But when compiling, i get the following issue:

```
[2/2] Linking CXX executable play
FAILED: [code=1] play
: && /usr/bin/clang++-21 -g -fuse-ld=lld CMakeFiles/play.dir/main.cpp.o -o play vcpkg_installed/x64-linux-clang21/debug/lib/libfmtd.a vcpkg_installed/x64-linux-clang21/debug/lib/libboost_cobalt.a vcpkg_installed/x64-linux-clang21/debug/lib/libopen62541pp.a vcpkg_installed/x64-linux-clang21/debug/lib/libboost_date_time.a vcpkg_installed/x64-linux-clang21/debug/lib/libboost_container.a vcpkg_installed/x64-linux-clang21/debug/lib/libboost_context.a vcpkg_installed/x64-linux-clang21/debug/lib/libopen62541.a -lpthread -lm -lrt && :
ld.lld: error: undefined symbol: boost::asio::detail::cancellation_handler>::write_op::cancel_impl>::call(boost::asio::cancellation_type)
>>> referenced by main.cpp
>>> CMakeFiles/play.dir/main.cpp.o:(vtable for boost::asio::detail::cancellation_handler>::write_op::cancel_impl>)

ld.lld: error: undefined symbol: boost::asio::detail::cancellation_handler>::write_op::cancel_impl>::destroy()
>>> referenced by main.cpp
>>> CMakeFiles/play.dir/main.cpp.o:(vtable for boost::asio::detail::cancellation_handler>::write_op::cancel_impl>)
clang++-21: error: linker command failed with exit code 1 (use -v to see invocation)
```

I'm compiling with clang++-21 and linking with lld, although, linking with ld also failed.

Other uses of the channel in non templated code, following the example code did compile:
(It's using the same Type when instanciating the channel).

```
auto ex = co_await boost::cobalt::this_coro::executor;

auto chan = std::make_shared>>(1u, ex);

opcua::services::readValueAsync(client, node,
[chan, ex](opcua::Result res) {
fmt::println("Received value: {}, executing coroutine.", res.hasValue() ? "Success" : "Error");
boost::cobalt::spawn(ex,
[chan, r = std::move(res)](this auto) -> boost::cobalt::task {
co_await chan->write(std::move(r));
}(),
boost::asio::detached
);
});
```

Maybe it's a compiler bug on my end? I'm not sure.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.