一、C接口

1. 简介

其他语言的接口都是在C接口的基础上,进一步的封装。

C的接口头文件为:onnxruntime_c_api.h

头文件内包含了详细的注释和说明。

总体上,除了一些数据结构的定义,C API 函数封装在如下结构体内,

struct OrtApi {
// 其中包含了一些函数指针,如下所示,
OrtStatus*(ORT_API_CALL* CreateStatus)(OrtErrorCode code, \
_In_ const char* msg)NO_EXCEPTION ORT_ALL_ARGS_NONNULL;
// ...
}

OrtApi的使用方式,一般是定义全局的指针OrtApi* g_ort;

然后,通过OrtGetApiBase()->GetApi(ORT_API_VERSION)获得struct Api*。

#include "onnxruntime_c_api.h"
OrtApi* g_ort = nullptr; int main() {
  g_ort = OrtGetApiBase()->GetApi(ORT_API_VERSION);
  return 0;
}

ORT_API_VERSION是头文件中定义的全局的宏,必须与链接的libonnxruntime.so内的相同。否则,会发生运行时的错误。

这里的函数OrtGetApiBase()->GetApi每次返回的指针,是相同的。因此,可以定义全局指针g_ort,方便后续调用OrtApi内的函数指针。

调用函数指针的方式,与C++普通成员函数类似。唯一的差别是,C++成员函数的第一个参数是this指针。

2. Api定义方式

struct OrtApi结构体内的函数指针定义,包含了大量的注释和宏。

大体上容易阅读的,需要注意的是很多宏仅仅是说明的作用,并没有生成二进制代码。

例如,

// 这些宏仅仅用作说明,函数参数的意义。
// 用来标志参数是输入还是输出,等等。
#define _In_
#define _In_z_
#define _In_opt_
#define _In_opt_z_
#define _Out_
#define _Outptr_
#define _Out_opt_

以一个struct OrtApi内的实际函数接口为例,

  ORT_API2_STATUS(CreateEnv, OrtLoggingLevel log_severity_level, _In_ const char* logid, \
_Outptr_ OrtEnv** out); // 这里的ORT_API2_STATUS是个宏,展开后,如下所示, _Check_return_ _Ret_maybenull_ OrtStatusPtr(ORT_API_CALL* CreateEnv)(OrtLoggingLevel log_severity_level, \
const char* logid, OrtEnv** out) NO_EXCEPTION ORT_MUST_USE_RESULT; // 上面实际上定义了一个函数指针(* CreateEnv),返回值是OrtStatusPtr
// 输入是(OrtLoggingLevel log_severity_level, const char* logid, OrtEnv** out)
// 其他下线开头的字符串,以及ORT_API_CALL
// 是一些说明性的宏,NO_EXCEPTION/ORT_MUST_USE_RESULT在不同平台下,不同的编译选项,有相对性的功能。

上述函数指针的调用方式是,

OrtEnv* my_ort_env;
auto current_ort_status = g_ort->CreateEnv(my_log_level, \
"my_log_id", &my_ort_env);

最新文章

  1. Java--Jsp内置对象列表
  2. [转] vim自定义配置 和 在ubnetu中安装vim
  3. ssh启动报错:org.dom4j.DocumentException: Connection timed out: connect Nested exception: Connection timed out: connect
  4. linux rpm问题:怎样查看rpm安装包的安装路径
  5. OOP作业
  6. highCharts图表入门实例
  7. DTD 简介
  8. IOS 支付宝、微信回调传值给H5网页
  9. codevs 1173 最优贸易(DP+SPFA运用)
  10. 谁在唱衰PC?说出你的理由
  11. 使用cmd命令打开Python文件式程序方法
  12. spring boot2 整合(一)Mybatis (特别完整!)
  13. 华为核心交换机绑定IP+MAC+端口案例
  14. flex布局居中无效果注意是否设置了宽度
  15. Java中的Future相关
  16. Lucene/Solr企业级搜索学习资源
  17. 【安装Python环境】之安装Selenium2时报UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 12: invalid continuation byte问题
  18. HDU.1846 Brave Game (博弈论 巴什博弈)
  19. Android蓝牙——HID开发
  20. sql server 博客:不胜人生一场醉

热门文章

  1. 动手写了个简单版的ChatGPT的Java版客户端
  2. 通过post请求添加员工信息到数据库
  3. video.js 注销上一个对象并重新初始化
  4. webapi参数接收不到特殊字符
  5. python的assert和raise的用法
  6. jumpserver运行源码
  7. 神奇的Object.assign()
  8. 【windows】 进程间通信 WM_COPYDATA消息
  9. 【傻瓜式教学】apache2 管理员用户运行(php无权限问题
  10. 一个好的程序应该像AK47