Windows下CMake构建带OpenCL的TensorFlow Lite C++编译及链接问题
Windows下构建支持OpenCL的TensorFlow Lite(适配AMD GPU)问题解决
问题背景与初始操作
要在Windows环境构建适配AMD GPU(不使用CUDA,启用OpenCL)的TensorFlow Lite,执行步骤如下:
- 克隆TensorFlow仓库到
tensorflow_src目录,切换到r2.14分支 - 在仓库旁创建
tflite-opencl文件夹 - 进入
tflite-opencl目录,执行:cmake C:/Users/Asus/Desktop/tensorflow/tensorflow/lite -DTFLITE_ENABLE_GPU=ON - 执行编译命令:
cmake --build . -j
编译错误与初步分析
编译时出现以下核心错误:
C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,20): error C2039: 'any_cast': is not a member of 'std' C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\selectors\operation_selector.cc(313,1): error C2065: 'any_cast': undeclared identifier ... C:\Users\Asus\Desktop\tensorflow\tensorflow\lite\delegates\gpu\common\tasks\special\conv_pointwise.cc(129,12): error C2039: 'any_cast': is not a member of 'std'
最初猜测是C标准版本低于C14,但修改cmake_install.cmake添加/std:c++17无效。后续发现问题根源是代码中缺失<any>头文件,在operation_selector.cc中添加#include <any>后,编译得到了Debug版本的.lib静态库,但未生成.dll文件,且将该lib导入项目时出现大量未解析外部符号错误。
完整修复步骤
1. 补全缺失的头文件
在以下两个文件的开头添加<any>头文件:
tensorflow/lite/delegates/gpu/common/selectors/operation_selector.cctensorflow/lite/delegates/gpu/common/tasks/special/conv_pointwise.cc
添加内容:
#include <any>
2. 正确设置C++标准
不要修改生成后的cmake_install.cmake,直接在CMake配置阶段指定C++标准,执行cmake命令时添加-DCMAKE_CXX_STANDARD=17参数:
cmake C:/Users/Asus/Desktop/tensorflow/tensorflow/lite -DTFLITE_ENABLE_GPU=ON -DCMAKE_CXX_STANDARD=17
3. 生成动态链接库(DLL)
默认CMake构建的是静态库(.lib),要生成动态库(.dll + 导入库.lib),需添加-DBUILD_SHARED_LIBS=ON参数,完整cmake命令:
cmake C:/Users/Asus/Desktop/tensorflow/tensorflow/lite -DTFLITE_ENABLE_GPU=ON -DCMAKE_CXX_STANDARD=17 -DBUILD_SHARED_LIBS=ON
重新执行编译:
cmake --build . -j --config Release
编译完成后,DLL文件会生成在Release目录下,同时包含对应的导入库.lib。
4. 解决未解析外部符号错误
出现该错误通常是以下原因:
- 库版本不匹配:确保项目的编译配置(Debug/Release)与TensorFlow Lite库的编译配置一致
- 缺少依赖库:TensorFlow Lite依赖多个系统库,需在项目中链接所有相关库(如
tensorflow-lite.lib、OpenCL相关库等) - 动态库定义缺失:如果使用动态库,需在项目中添加预定义宏
TFLITE_SHARED_LIB(在Visual Studio的项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中添加)
5. 构建INSTALL目标(统一部署库与头文件)
如果需要将TensorFlow Lite的库、头文件统一安装到指定目录,可在CMake配置时指定安装路径,再构建INSTALL目标:
- 配置CMake时添加
-DCMAKE_INSTALL_PREFIX参数指定安装目录:cmake C:/Users/Asus/Desktop/tensorflow/tensorflow/lite -DTFLITE_ENABLE_GPU=ON -DCMAKE_CXX_STANDARD=17 -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=C:/tflite_install - 构建INSTALL目标:
cmake --build . -j --config Release --target INSTALL
执行完成后,C:/tflite_install目录下会自动生成include(头文件)、lib(库文件)、bin(DLL文件)目录,方便后续导入项目使用。
内容的提问来源于stack exchange,提问作者Turgut
相关产品推荐
相关产品推荐

