Golang1.7动态库的使用,C和Golang的动态库以及使用
来源:互联网 发布:淘宝c店手机端图片尺寸 编辑:程序博客网 时间:2024/06/06 09:16
使用Golang写C的动态库,当前项目目录root@working-srv: tree ././|-- hello| `-- main.go`-- main.c
root@working-srv: more hello/main.go package mainimport "C"func main() {}//export Hellofunc Hello() string { return "Hello"}//export Testfunc Test() { println("export Test")}
root@working-srv: more main.c #include<libhello.h>#include<stdio.h>void main(){ GoString str; str=Hello(); Test(); printf("%s\n",str);}
首先将hello/main.go编译成动态库,使用下面的命令go build -x -v -ldflags "-s -w" -buildmode=c-shared -o libhello.so helloroot@working-srv: tree ././|-- hello| `-- main.go|-- libhello.h|-- libhello.so`-- main.c执行完毕的目录结构到多了libhello.h 和 libhello.so使用下面的命令编译C文件.(-L指定动态链接库目录 -l指定动态链接库文件 -I指定头文件目录)gcc -I./ -L./ -lhello -o main main.croot@working-srv: tree ././|-- hello| `-- main.go|-- libhello.h|-- libhello.so|-- main`-- main.c这里可以看到编译出了main文件.root@working-srv: ./main export TestHelloroot@working-srv: ./main export TestHello这里有个注意的地方就是main.go文件中的//export Hello 和 //export Test这个是有作用的,没有这个就不会生成对应的头文件方法.也就是此方法就不会被导出.
项目目录root@working-srv:/data/code/src# tree project workspace/project└── pro.goworkspace/└── main.go
main.gopackage mainimport ( "project")func main() { project.Hello() project.Server(":1789")}
pro.gopackage projectimport ( "fmt" "net/http")func Hello() { fmt.Println("Hello this is dynamic libary")}func Server(laddr string) { http.HandleFunc("/", route) http.ListenAndServe(laddr, nil)}func route(w http.ResponseWriter, r *http.Request) { fmt.Println("Reques:", r.URL.String()) switch r.URL.Path { case "/": fmt.Fprint(w, "Welcome to czxichen blog.") case "/test": fmt.Fprint(w, r.Header) ()}
使用下面命令将project编译成动态库(-ldflags "-s -w" -x -v 可以不使用)root@working-srv:/data/code/src# go install -x -v -ldflags "-s -w" -buildmode=shared -linkshared project使用下面命令编译main函数:go build -ldflags "-s -w" -linkshared -o server workspac编译之后产看依赖:root@working-srv:/data/code/src# ldd server linux-vdso.so.1 => (0x00007fff79dc6000) libruntime,sync-atomic.so => /data/go/pkg/linux_amd64_dynlink/libruntime,sync-atomic.so (0x00007fb56d2e4000) libproject.so => /data/code/pkg/linux_amd64_dynlink/libproject.so (0x00007fb56c7c3000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb56c3f8000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb56c1da000) /lib64/ld-linux-x86-64.so.2 (0x00007fb56d6c7000)至此动态库就能使用了.注意可能会报错runtime.a atomic 什么之类的错误go install -buildmode=shared runtime sync/atomic 使用此命令解决.编译动态库的时候project目录也是不可以删除的,否侧会报错误找不到包
2 0
- Golang1.7动态库的使用,C和Golang的动态库以及使用
- Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a
- 【C语言】【unix c】动态库的制作和使用
- Linux C 静态库和动态库的使用
- C中静态库和动态库的使用
- DLL:创建和使用动态链接库的步骤 (C++)
- C语言动态封装库的建立和使用
- Golang与C互用以及调用C的so动态库和a静态库
- C语言动态库的使用
- linux c动态链接库的使用
- linux c动态链接库的使用
- Golang1.8编译静态库给C使用
- 动态库的使用
- 动态库的使用
- 动态库和静态库的使用以及gdb调试器的使用复习
- Linux下动态链接库的创建和使用及C调用matlab动态库问题
- Linux下动态链接库的创建和使用及C调用matlab动态库问题
- 【C/C++开发】C++静态库与动态库以及在Linux和Windows上的创建使用
- 测试测试
- Android电池信息(Battery information)
- poj-1664【放苹果】
- cpu cache line 原理
- 欢迎使用CSDN-markdown编辑器
- Golang1.7动态库的使用,C和Golang的动态库以及使用
- 一致性哈希算法(consistent hashing)
- BZOJ - 1609/USACO - Feb08 Silver Eating Together 麻烦的聚餐 重庆一中高2018级竞赛班第九次测试 2016.9.10 Problem 2
- 后台学习之---ServletContext学习
- 设计模式——观察者模式(C++)
- 时钟一:51单片机用替换的方法在数码管上显示时钟
- jdbc连接mysql数据库出现中文乱码需要注意的问题
- 多重部分和
- linux ubuntu samba 服务器