1、so动态库文件的生成;
首先编写.c源文件和.h头文件;
使用gcc编译工具编译生成.so文件
gcc -shared source.c -o libname.so
或gcc -shared -fPIC source.c -o libname.so
-fPIC具体的意思需要查一下;
【注意】我在使用过程中,so动态文件的明明一定要注意,文件名一定要lib开头,libxxx.so,在之后导入时不需要加lib,如#cgo LDFLAGS: -L./ -lxxx即可;
2、go语言如何调用;
go语言想调用C语言的动态库,可通过cgo,具体用法如下:
package main
/*
#cgo CFLAGS: -I
#cgo LDFLAGS: -L -l
#include "header_file"
*/
import "C"
func main(){
C.function()
}
3、在使用前先更改路径LD_LIBRARY_PATH
linux系统下动态库也称共享库,自己生成的so文件可能也需要依赖第三方库,改变量就是告诉系统哪里可以找到需要的共享库;如果没有LD_LIBRARY_PATH,程序将无法找到,因此可以查看变量LD_LIBRARY_PATH的值,如果没有,需要手动添加:
export LD_LIBRARY_PATH=
4、demo
C语言源函数:
//happy.c
#include
void sayhi(){
printf("hello, world!\n");
printf("bye-bye!\n");
}
int add(int a, int b){
printf("%d+%d=%d", a, b, a+b);
return a+b;
}
头文件
//happy.h
void sayhi();
int add(int, int);
生成so文件:
gcc -shared happy.c -o libhappy.so
go语言主函数
//main.go
package main
/*
#cgo CFLAGS: -I./
#cgo LDFLAGS: -L./ -lhappy
#include "happy.h"
*/
import "C"
import "fmt"
func main(){
a:=C.add(3, 4)
fmt.Println(a)
C.sayhi()
}
通过CFLAGS配置编译选项,
通过LDFLAGS来链接指定目录下的动态库。
import "C"是紧挨着注释的,没有空行。
export LD_LIBRARY_PATH = ./:$LD_LIBRARY_PATH
go run main.go
**
**
//main.go
package main
/*
#include "happy.c"
*/
import "C"
import "fmt"
func main(){
a:=C.add(3, 4)
fmt.Println(a)
C.sayhi()
}
全局变量的作用域是整个包,局部变量的作用域则只有对应的花括号内{};
全局变量需使用var来定义,在使用过程中尽量避免使用:=,因为在作用域中使用:=将会造成生成局部变量,而非对全局变量进行操作;原则是就近原则