欢迎访问我的博客,你的支持,是我最大的动力!

在Go程序中使用C动态库

Linux 小马奔腾 401℃ 评论
目录:
[显示]

【原文】Using C Dynamic Libraries In Go Programs
以下代码来自于上述地址,并在CentOS下进行测试

c 程序

yum install gcc ncurses-devel
# ncurses库位置
# /lib64/libncurses.so.5

此时 test 程序即可运行 ./test
# 查看引用的动态库 ldd ./test

使用cgo

目标,将c语言的 keyboard.c 编译为动态库 libkeyboard.so 并在Go源文件main.go中调用 动态库中函数

1、编译动态库

DyLib目录:
运行 make 命令即可

2、cgo部分

TestApp目录:
运行 go build 即可生成 TestApp 可执行程序
# 运行ldd TestApp 可看到程序引用的库文件,发现libkeyboard.so 状态为not found
# 这里因为 so 动态库仅从系统默认库文件目录中加载  并不会在当前文件夹下查找
cp libkeyboard.so /usr/lib64/
执行程序 ./TestApp

ldd TestApp
linux-vdso.so.1 => (0x00007fff29de0000)
libkeyboard.so => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f15e402f000)
libc.so.6 => /lib64/libc.so.6 (0x00007f15e3c62000)
/lib64/ld-linux-x86-64.so.2 (0x00007f15e4255000)

其中:
import "C"上方注释中声明了提供给编译器和链接器所需要的参数,它们和import命令之间不能有空行或其它语句,否则会编译错误

/*
#cgo CFLAGS: -I../DyLib        # CFLAGE标记向编译器提供参数 这里指定了寻找头文件的路径
#cgo LDFLAGS: -L. -lkeyboard  # LDFLAGS标记向链接器提供参数 -L指定动态库的路径 -l指定动态库名字,注意不要lib和.so
#include <keyboard.h>  # 引入头文件
*/
import "C"

也可写成下面这样

//#cgo CFLAGS: -I../DyLib
//#cgo LDFLAGS: -L. -lkeyboard
//#include <keyboard.h>
import "C"

参考资料:
1、Using C Dynamic Libraries In Go Programs
2、C? Go? Cgo!
3、Command cgo

 

转载请注明:轻风博客 » 在Go程序中使用C动态库

喜欢 (0)or分享 (0)