问题背景
将VS+QT(MSVC)环境下编写的代码转到纯QT环境下,并更改编译环境为MinGW后,所用的onnxruntime库报错:error: '_Frees_ptr_opt_' has not been declared
原因
上述错误是由于编译器无法识别 _Frees_ptr_opt_
这个宏。 _Frees_ptr_opt_
是一个用于标记释放指针的宏,通常在微软的编译器(如MSVC)中定义。
解决办法
方法一:定义宏
在编译器命令行或者代码中定义这些宏,使其在非MSVC环境中被忽略。在代码的开头(如 onnxruntime_c_api.h
文件中)添加以下代码:
#ifndef _Frees_ptr_opt_
#define _Frees_ptr_opt_
#endif
#ifndef _In_
#define _In_
#endif
#ifndef _Out_
#define _Out_
#endif
#ifndef _Inout_
#define _Inout_
#endif
这样编译器在遇到这些宏时就会忽略它们,从而避免编译错误。
方法二:修改编译选项
如果使用CMake进行构建,可以通过修改CMakeLists.txt文件,添加对这些宏的定义:
add_definitions(-D_Frees_ptr_opt_ -D_In_ -D_Out_ -D_Inout_)
方法三:使用预处理指令
还可以通过在编译命令中添加预处理定义:
g++ -D_Frees_ptr_opt_= -D_In_= -D_Out_= -D_Inout_= your_source_file.cpp
方法四:调整包含顺序
确保在包含 onnxruntime_c_api.h
之前定义这些宏,或调整包含顺序,使得这些宏在需要的位置之前被定义。
示例修改
#define _Frees_ptr_opt_
#define _In_
#define _Out_
#define _Inout_
#include "onnxruntime_c_api.h" // 你的代码