Boost1.77.0 Websocket编译报executor_非法使用void类型错误求助
问题根因
这个编译错误确实由项目中的.cu(CUDA)文件触发。
Boost 1.77.0的Asio组件使用了C17的定制点对象特性实现execution::outstanding_work.tracked的优先调度逻辑,但你当前版本的NVCC(CUDA编译器)对该C17特性的支持存在缺陷:当NVCC编译包含Boost.Asio头文件的单元时,会错误推导prefer_result的返回类型为void,最终导致composed_work_guard类的executor_成员类型为void,触发C2182错误。
你新建的纯C++解决方案没有调用NVCC编译,用的是MSVC原生编译器,因此不会触发这个兼容问题。
修复方案
- 依赖隔离:将Boost.Beast/WebSocket的相关逻辑封装到独立的纯C++编译单元(.cpp/.h)中,保证这些头文件不会被任何
.cu文件直接或间接引用,CUDA单元仅调用封装后的无Boost依赖的接口即可。 - 宏定义兼容:如果无法完全隔离头文件引用,可在所有引入Boost.Asio相关头文件的位置之前,添加宏定义:
该宏会强制Asio回退到旧版的函数重载实现逻辑,避开NVCC不支持的C++17定制点特性。#define BOOST_ASIO_DISABLE_CUSTOMIZATION_POINT_OBJECTS - 版本升级:可选升级Boost到1.79及以上版本,该版本已专门修复了NVCC编译Asio的兼容问题;也可升级CUDA工具包到11.6及以上版本,新版NVCC对C++17特性的支持更完善,可直接解决该推导错误。
内容的提问来源于stack exchange,提问作者Castigliano
相关产品推荐
相关产品推荐

