c - golang cgo 检查C函数是否存在

标签 c go cgo

我正在通过 CGO 链接一个库,并不是所有的实现或版本都有我想在可能的情况下使用的功能——即函数 int feature(void) 的存在。有没有一种方法可以在尝试调用之前检查此符号是否已定义?

任何尝试使用 C.feature() 都会在不支持该功能的库版本的系统上导致构建失败。

如果不清楚,我想针对许多平台进行构建,这些平台可能具有也可能不具有该功能。我想我要么需要能够在运行时检查函数是否存在(更理想),要么使用 go:generate 进行检查并根据发现的内容更改代码(不太理想) ).无论哪种方式,我都不太确定具体如何进行。

最佳答案

大多数库都带有描述其版本的 #define

例如在1.0版本中:

// simple.h
#define LIB_SIMPLE_VERSION 0x00010000

void hello();

在 1.1 版中:

// simple.h
#define LIB_SIMPLE_VERSION 0x00010001

void hello();
void bye();

你有很多选择:

  • 提供一个IsByeAvailable()函数来检查是否存在
  • 修改 Go 中 bye() 的签名,使其返回一个 error,或者一个 bool 表示 ok
  • 如果实现不存在则 panic

选择1的代码

// simple.go

// #include <simple.h>
import "C"

func IsByeAvailable() bool {
    return C.LIB_SIMPLE_VERSION >= 0x00010001
}

func Hello() {
    C.hello()
}

func Bye() {
    C.bye()
}
// version_support.c
#include <simple.h>
#if LIB_SIMPLE_VERSION < 0x00010001
void bye() { /* Empty */ }
#endif

关于c - golang cgo 检查C函数是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39041435/

相关文章:

go - 从字符串列表初始化结构

与 Go 之间的 C 指针转换

go - 正确的 Go 类型传递给 C 函数?

arrays - 如何从 C 函数返回 C 结构数组?

c++ - 如何从C++源文件访问C源文件中的全局变量

c - Linux串口编程,ttyS0

c - 二维数组,打印索引。?

docker - 如何连接到RabbitMQ(docker-compose)?

go - RSA key 导出和导入

c - 在 C 中添加到链表的前面