C/C++语言调用Go库
编译go代码为动态库/静态库
Go语言写的代码可以编译为动态库或静态库,之后C语言链接该动态库或静态库就可以调用Go语言写的代码。下面用ubuntu20.04下的操作方法来演示。
新创建一个文件夹,编写一个属于main包的go语言代码文件a.go如下:
package main;
import "C"
func main() {}
//export Hello
func Hello() string {
return "Hello"
}
//export Print_a
func Print_a() {
println("aaaaa")
}
然后可以用下面的命令编译成动态库:
之后可以看到go编译器生成的liba.so动态库文件。
或者用下面的命令编译成静态库:
之后可以看到go编译器生成的liba.a和liba.h静态库文件
使用静态库
之后如果使用静态库的话,将静态库放到需要使用库的C语言源代码的同一目录下。假设C语言的代码(test.c)如下:
#include <stdio.h>
#include "liba.h"
void main()
{
GoString str;
str = Hello();
Print_a();
printf("%d\n",(int)str.n);
}
使用静态库时,编译命令与结果如下:
运行:
这样就成功实现了C语言使用静态库中的go函数。
使用动态库
之后如果使用动态库的话,假设C语言的代码(test.c)仍然如下:
#include <stdio.h>
#include "liba.h"
void main()
{
GoString str;
str = Hello();
Print_a();
printf("%d\n",(int)str.n);
}
如果用动态库链接需要将当前编译后动态库所在路径加到 L D L I B R A R Y P A T H 中 再 运 行 程 序 , 或 者 将 当 前 编 译 的 动 态 库 放 入 LD_LIBRARY_PATH中再运行程序,或者将当前编译的动态库放入 LDLIBRARYPATH中再运行程序,或者将当前编译的动态库放入LD_LIBRARY_PATH路径下。
编译结果:
运行结果:
这样就成功实现了C语言使用动态库中的go函数。