栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

go调用c/c++ 示例

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go调用c/c++ 示例

调用纯c,可以直接把代码嵌入go,

如果是c++,笔者没有找到直接嵌入go的好方法

笔者找到可行的方法是,

把c++代码编译成动态库, 

再做一个纯c接口,调用相应的c++代码

对象(不管是struct还是class)统一用void* 代替,并提供接口设置对象的成员变量

库文件一定要以 libxxx.so  libxxx.dll这个的方式命名(go是linux style)

示例代码如下(以vsstudio为例,linux下面对应直接make生成.so即可)

c++ dll代码

如果是用vsstudio dll导出要用.def的方式进行,如下

LIBRARY libtestdll
EXPORTS
TestDLLAdd
TestDLLSub

如果是linux,对应的生成.so makefile

INCL=-I./include
LIBDIR=-L./lib
LIB=
OUTPUT=./
FLAG=-fPIC

.SUFFIXES: .cpp .c

.cpp.o:
        g++ ${INCL} ${FLAG} -c $<
.c.o:
        gcc $(INCL) ${FLAG} -c $<


all: clean libtest.so test

libtest.so: testdll.o testcpp.o
        gcc -o $@ -shared $? $(LIBDIR) $(LIB) -lstdc++
        mv ./libtest.so ./lib/


test: main.o
        gcc -o $@ $? $(LIBDIR)$(LIB) -ltest


clean:
        rm -fr .
import "C"

func main() {
	fmt.Println(C.TestDLLAdd(41,22))
}

其中 -Icpp 表示.h文件所在目录是./cpp

-Llib表示对应的 libxxx.lib libxxx.dll所在的目录是 ./lib

-ltestdll:表示动态库的名字,  生成的是啥,就写啥 一定要命名成 libxxx.so 或者 libxxx.dll

运行之后就会是这样

 

参数类型

如果整形 C.int

如果是size_t对应的go类型是 C.size_t

如果是字符串指针 对应的是 *C.char

以此类推,所有的c内置类型对应的go类型都加上 C.就可以,

考虑到字节对齐问题,尽量避免使用结构体做参数

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/908371.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号