目录

Golang中嵌入C代码

Golang中调用C的动态库so

Golang调用C的静态库a


Golang与C的关系非常密切,下面主要介绍在Golang中使用C。

Golang中嵌入C代码

package main//#include <stdio.h>
//#include <stdlib.h>
/* 6 void Hello(char *str) { 7 printf("%s\n",str); 8 } 9 */
import "C" //假设把C当成包,其实有点类似C++的名字空间
import "unsafe" //C指针的使用,在C代码中申请的空间,GC垃圾回收机制不会管理,所以需要自己手动free申请的空间func main() {s := "Hello Cgo"cs := C.CString(s)C.Hello(cs)C.free(unsafe.Pointer(cs))
}

3,4行的注释也可以写/* */形式
第4行与第5行之间不能有空行,同样第9行与第10行之间也不
能有行,否则编译时cgo会报错:

jack@jack-VirtualBox:~/mygo/src/myC/tmp$ go run goc.go
# command-line-arguments
could not determine kind of name for C.Hello
could not determine kind of name for C.free

Golang中调用C的动态库so

C库源程序代码:

//foo.c
#include <stdio.h>int Num = 8;void foo(){printf("I dont have new line.");printf("I have new line\n");printf("I have return\r");printf("I have return and new line\r\n");
}
//foo.h
#ifndef __FOO_H#define __FOO_H#ifdef __cplusplusextern "C" {#endifextern int Num;extern void foo();#ifdef __cplusplus}#endif#endif

Go调用C库的代码:

package main/* 4 #cgo CFLAGS: -I. 5 #cgo LDFLAGS: -L. -lfoo 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include "foo.h" 9 */
import "C"
import "unsafe"
import "fmt"func Prin(s string) {cs := C.CString(s)defer C.free(unsafe.Pointer(cs))C.fputs(cs,(*C.FILE)(C.stdout))//C.free(unsafe.Pointer(cs))C.fflush((*C.FILE)(C.stdout))
}func main() {fmt.Println("vim-go")fmt.Printf("rannum:%x\n",C.random())Prin("Hello CC")fmt.Println(C.Num)C.foo()
}

注意import “C”这行与第9行之间也不能有空格,原因同上编译会报错。
go与库、头文件的目录结构,以及编译:

jack@jack-VirtualBox:~/mygo/src/myC/sotest$go build cc.go //编译之后产生cc
jack@jack-VirtualBox:~/mygo/src/myC/sotest$ ls
cc cc.go foo.h libfoo.so
jack@jack-VirtualBox:~/mygo/src/myC/sotest$ export LD_LIBRARY_PATH=./
jack@jack-VirtualBox:~/mygo/src/myC/sotest$ ./cc
vim-go
rannum:6b8b4567
Hello CC8
I dont have new line.I have new line
I have return and new line

如果c库的程序改为下面这样:

//foo.c
#include <stdio.h>int Num = 8;void foo(){printf("I dont have new line.");//printf("I have new line\n");//printf("I have return\r");//printf("I have return and new line\r\n");
}

此时,go中调用foo时没有任何反应,即不会输出,不会输出的原因是printf后面没有加换行符,但是如果加了8,9,10这些测试行后,第7行也会显示,原因是第10行最后有一个换行符,这个应该是向stdout输出时,字符流是放在buffer中,如果没有换行,buffer中的数据不会立即输出。在go调用C的测试程序中有写了一个测试小函数用来测试stdout,验证了没有fflush,stdout上不会显示输出信息。但平时在写C程序的时候,似乎没有这样的问题,这个是因为C的运行环境自动做了fflush的动作,这个可能是Golang的不足,也许golan表g认为这样做更好。这只是个人的分析,如有分析不对的地方,请跟贴,谢谢。

Golang调用C的静态库a

所有源程序与动库演示代码类似,只是编译C库时,是用的静态编译,如下所示:

jack@jack-VirtualBox:~/mygo/src/myC$ ls
foo.c
jack@jack-VirtualBox:~/mygo/src/myC$ gcc -c foo.c
foo.c foo.o
jack@jack-VirtualBox:~/mygo/src/myC$ ar -rv libfoo.a foo.o
foo.c foo.o libfoo.a

Go调用的代码与动态库一样,下面是目录结构:

jack@jack-VirtualBox:~/mygo/src/myC/atest$ ls
cc cc.go foo.h libfoo.a

golang 调用 c 动态库so 静态库a相关推荐

  1. 实时系统vxWorks - 动态库、静态库建立及调用

    概述 静态库的本质就是将多个目标文件打包成一个文件.在使用时链接静态库就是将库中被调用的代码复制到调用模块中. 动态库又名共享库,和静态库最大的不同就是,链接共享库并不需要将库中被调用的代码复制到调用 ...

  2. Linux下动态库和静态库制作与调用

    Linux下动态库和静态库制作与调用 1.动态库和静态库简介   静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所 ...

  3. linux代码动态分析软件,举例分析Linux动态库和静态库

    函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...

  4. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  5. Linux中的动态库和静态库(.a/.la/.so/.o)

    为什么80%的码农都做不了架构师?>>>    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序 ...

  6. 举例分析Linux动态库和静态库

    转自:http://www.xxlinux.com/newxxlinux/development/gui/2012-01-05/499.html 函数库分为静态库和动态库两种.创建Linux静态库和L ...

  7. 【Android NDK 开发】Android Studio 使用 CMake 导入静态库 ( CMake 简介 | 构建脚本路径配置 | 引入静态库 | 指定静态库路径 | 链接动态库 )

    文章目录 I . CMake 简介 II . Android Studio 中 CMake 引入静态库流程 III . 指定 CMake 最小版本号 IV . 导入函数库 ( 静态库 / 动态库 ) ...

  8. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  9. 动态库和静态库的创建

    库:一组别人实现好的函数接口 1.命名方法  静态库 : libname.a  动态库 : libname.so  注意   :库的名字是name  2.链接动态库和静态库的区别  预处理,编译,汇编 ...

  10. c语言仿ce内存搜索工 源代码_C语言函数库:动态库和静态库优缺点比较

    函数的重要性 我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护.我们可以把他们制 ...

最新文章

  1. 最诡异数学悖论:1+1=1
  2. 怎么挪动_2020蚕茧多少钱一斤,蚕茧怎么做成蚕丝被
  3. sqli-lab--writeup(7~10)文件输出,时间布尔盲注
  4. python对数据进行统计分析_python获取ELK数据进行统计分析
  5. 服务器访问RabbitMQ出现 User can only log in via localhost
  6. 一位全加器的设计与仿真
  7. php学生成绩系统,php019学生信息学生成绩系统
  8. ArcGIS操作系列(一)之地理配准
  9. matlab 填充透明色,在Matlab中使用透明像素填充数组
  10. (转载)基于联盟链区块链的九个方面对比
  11. 无法使用内置管理员账户打开Microsoft Edge
  12. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java影视资源分享论坛23562
  13. ad19覆铜_AD19如何单独设置单个焊盘与铜皮的连接方式
  14. php引用字体,thinkphp引入字体文件时候被当做模块求解决问题
  15. Android: 如何切换 SCO 链路。
  16. 三、Qt常用容器之QList
  17. AndroidUSB—OTG通信
  18. java基础-常用快捷键及基本dos命令
  19. TensorFlow 1.13.0-rc最新版本说明
  20. MATLAB信号处理——信号与系统的分析基础(3)

热门文章

  1. Linux 虚拟化网络技术 — 虚拟网线(Veth-pair)
  2. OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发
  3. Oracle架构实现原理、含五大进程解析(图文详解)
  4. QT Desinger设计窗体应用程序框架
  5. gcc在Ubuntu上安装和使用
  6. word取消“在页面视图中显示页面间空白”后,关闭打开又自动勾上
  7. MDK编译后生成bin文件占用FLASH大小说明
  8. JavaScript疑难杂症系列-事件循环
  9. [Android]实现类似微信的延迟加载的Fragment——LazyFragment
  10. RQNOJ 83 魔兽世界