我正在通过 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/