你需要知道如何调用那个 so 文件的(输出)接口,这个通常在 SDK 文档或 .h 头文件中描述。 知道调用方法了,若 *.h 文件缺失,可透过一些命令查出 so 文件的输出接口(函数),如 nm -D --defined-only xxx.so 或逆向工程解析出接口(及参数)。 举个例子,演示如何调用 libadder.so 的 int add(int a, int b) 接口函数。 文件结构 ├── main.go // 调用接口函数 └── shared-lib ├── adder.c // so 功能实现 ├── adder.h ├── libadder.so // 由 Makefile 生成 └── Makefile 文件内容 adder.h #ifndef _ADDER_H_ #define _ADDER_H_ int add(int a, int b); #endif adder.c int add(int a, int b) { return a + b; } Makefile libadder.so: adder.c gcc -shared -Wall -O2 -std=c11 -fPIC -o $@ $^ main.go package main /* #cgo CFLAGS: -Ishared-lib/ #cgo LDFLAGS: -Lshared-lib/ -ladder #include <adder.h> */ import "C" import "fmt" func main() { fmt.Println("1 + 2 = ", C.add(1, 2)) } 编译使用 生成 so 文件: make -C shared-lib 运行 go 文件: LD_LIBRARY_PATH=$(pwd)/shared-lib go run main.go
你需要知道如何调用那个 so 文件的(输出)接口,这个通常在 SDK 文档或 .h 头文件中描述。
知道调用方法了,若 *.h 文件缺失,可透过一些命令查出 so 文件的输出接口(函数),如
或逆向工程解析出接口(及参数)。
举个例子,演示如何调用 libadder.so 的
int add(int a, int b)
接口函数。文件结构
文件内容
adder.h
adder.c
Makefile
main.go
编译使用
make -C shared-lib
LD_LIBRARY_PATH=$(pwd)/shared-lib go run main.go