OpenCL-HPP setDefault函数触发std::system_error崩溃问题咨询
问题1:崩溃问题修复方案
- 方案1:补充CMake编译配置,强制完整链接pthread库
修改你的CMakeLists.txt,在find_package(Threads REQUIRED)前添加两行配置:
set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE)
修改后重新生成编译配置编译即可,该配置会强制CMake把完整的pthread链接参数加入编译选项,解决老版本GCC libstdc++ 中std::call_once依赖pthread符号未找到的问题。
- 方案2:添加OpenCL-HPP专用宏绕过call_once逻辑
在业务代码的宏定义区域新增一行:
#define CL_HPP_USE_LEGACY_DEFAULT_PLATFORM
该宏会让OpenCL-HPP停用基于call_once的默认平台初始化逻辑,改用老式全局变量初始化,完全避开触发call_once报错的代码路径。
- 额外代码逻辑修正:你当前代码中筛选出了符合要求的OpenCL 2.0平台
plat,但调用setDefault时传入的是platforms[0],如果第一个平台不是你筛选出的2.0平台,后续校验逻辑会报错,建议将参数改为筛选得到的plat变量。
问题2:OpenCL-HPP的线程依赖说明
OpenCL-HPP本身没有独立的线程实现,所有线程相关逻辑完全依赖C标准库提供的设施。在Linux系统下,GCC的libstdc标准库的std::call_once、std::mutex等线程相关接口底层均封装pthread实现,因此最终链接时必然依赖pthread库,不存在标准库线程实现和pthread冲突的情况,你遇到的报错本质是老版本Ubuntu(16.04)自带的GCC默认没有将pthread完整链接到二进制文件中,导致标准库调用pthread接口时符号缺失触发异常。
内容的提问来源于stack exchange,提问作者Marko Bencik
相关产品推荐
相关产品推荐

