go语言调用c库 go调用c函数

golang中调用c的正确姿势

工程结构如上图所示,我们需要实现的目标是在go文件中调用c文件

创新互联公司专注于温宿网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供温宿营销型网站建设,温宿网站制作、温宿网页设计、温宿网站官网定制、小程序设计服务,打造温宿网络公司原创品牌,更为您提供温宿网站排名全网营销落地服务。

foo.c如下:

foo.go如下

foo.h如下:

编译过程如下:

1、先将c文件编译为.o文件,然后生成动态链接库.dylib文件

(1) clang -c foo.c

(2 clang -shared foo.o -o libfoo.dylib

2、在上述的动态链接库生成之后,在foo.go中添加动态链接命令:#cgo LDFLAGS: -L./ -lfoo

需要注意的是

中间不能有空格

GOOGLE的GO语言怎么样? 现在主要在哪些领域里用到?工作情况如何?前景?谢绝黏贴

看到了你的问题才知道有GO语言,反正都是一是编程用的语言,语言没有高低贵残,好坏之分,也没有什么主要领域之分,只能说适者生存,你用起随手就行了,不过GO语言让我觉的是一门新的语言,你在开发过程中遇到的问题大概很难找到资料,如果 你是新手,还是不建议你GO语言入门,还有一点,新的语言在没有被普及前会比较蛋疼,没有市场,缺少类,缺少平台的api

go怎么调用自己用c/c++写的so中的方法

直接调用so的函数cgo应该绕不开吧,我写过一个银行的应用程序调用其特色业务接口,因为接口只支持c和java,我就封装了一个c的so,然后用cgo调用后写了一个RPC供远程的go语言调用,因为RPC只负责信息交互不负责业务逻辑,所以写了不到百行,以后基本不用再改。记住虽然go语言自带gc,但cgo还是要手工释放内存哦。

go语言如何调用c函数

直接嵌入c源代码到go代码里面

package main

/*

#include stdio.h

void myhello(int i) {

printf("Hello C: %d\n", i);

}

*/

import "C"

import "fmt"

func main() {

C.myhello(C.int(12))

fmt.Println("Hello Go");

}

需要注意的是C代码必须放在注释里面

import "C"语句和前面的C代码之间不能有空行

运行结果

$ go build main.go ./main

Hello C: 12

Hello Go

分开c代码到单独文件

嵌在一起代码结构不是很好看,很多人包括我,还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码。

$ ls

hello.c hello.h main.go

$ cat hello.h

void hello(int);

$ cat hello.c

#include stdio.h

void hello(int i) {

printf("Hello C: %d\n", i);

}

$ cat main.go

package main

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

编译运行

$ go build ./main

Hello C: 12

Hello Go

编译成库文件

如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库。

$ find mylib main

mylib

mylib/hello.h

mylib/hello.c

main

main/main.go

编译库文件

$ cd mylib

# gcc -fPIC -shared -o libhello.so hello.c

编译go程序

$ cd main

$ cat main.go

package main

// #cgo CFLAGS: -I../mylib

// #cgo LDFLAGS: -L../mylib -lhello

// #include "hello.h"

import "C"

import "fmt"

func main() {

C.hello(C.int(12))

fmt.Println("Hello Go");

}

$ go build main.go

运行

$ export LD_LIBRARY_PATH=../mylib

$ ./main

Hello C: 12

Hello Go

在我们的例子中,库文件是编译成动态库的,main程序链接的时候也是采用的动态库

$ ldd main

linux-vdso.so.1 = (0x00007fffc7968000)

libhello.so = ../mylib/libhello.so (0x00007f513684c000)

libpthread.so.0 = /lib64/libpthread.so.0 (0x00007f5136614000)

libc.so.6 = /lib64/libc.so.6 (0x00007f5136253000)

/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)

理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接。

go语言怎么连接oracle数据库

//假设的GOPATH指向C:\gohome

0. 执行 go get github.com/wendal/go-oci8 ,然后肯定是报错了,没关系,代码会下载下来.

1. 首先,你需要安装mingw到C:\mingw

2. 然后,到Oracle官网,下载OCI及其SDK,解压到instantclient_11_2 -- 当前最新版

3. 从我的go-oci8库的windows文件夹,拷贝pkg-config.exe到C:\mingw\bin\,拷贝oci8.pc到C:\mingw\lib\pkg-config\

4. 设置环境变量 PATH ,值为 原有PATH;C:\instantclient_11_2;C:\mingw\bin;

5. 设置环境变量 PKG_CONFIG_PATH,值为 C:\mingw\lib\pkg-config

6. 接下来,就最重要的,就是再执行一次,这次应该能成功的: go get github.com/wendal/go-oci8

7. 测试一下:

cd %GOPATH%/src/github.com/wendal/go-oci8/example

go run oracle.go

#提醒一句, oracle.go里面的写的密码是system/123456, 实例名XE

如何在golang 中调用c的静态库或者动态库

Cgo 使得Go程序能够调用C代码. cgo读入一个用特别的格式写的Go语言源文件, 输出Go和C程序, 使得C程序能打包到Go语言的程序包中.

举例说明一下. 下面是一个Go语言包, 包含了两个函数 -- Random 和 Seed -- 是C语言库中random和srandom函数的马甲.


分享名称:go语言调用c库 go调用c函数
文章位置:http://bzwzjz.com/article/hidcei.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 重庆网站建设 网站建设 成都企业网站设计 盐亭网站设计 企业网站建设 网站建设公司 手机网站制作 营销网站建设 重庆网站制作 泸州网站建设 重庆网站建设 网站设计公司 网站建设改版 手机网站制作 专业网站设计 网站制作 成都网站设计 成都网站建设公司 成都营销网站制作 成都品牌网站设计 网站建设方案 重庆外贸网站建设