golang调用so库同步函数停止

Python011

golang调用so库同步函数停止,第1张

测试动态库步骤:

1、test_so.h

2、test_so.c

3、生成so

4、复制so文件到Go项目目录

Go项目目录

1、load_so.h

2、load_so.c

3、test.go

4、Go项目目录要放在$GOPATH/src/目录下,这也是正常操作。

test目录为Go项目,里边是上述创建的所有源码文件。

在$GOPATH/src/test/里直接使用gobuild编译生成test二进制文件,此处需要注意执行路径。

问题

1、/**/注释的代码下一行一定是import“C”,中间不能有空行

2、importC必须单独一行,不能和其它库一起导入

3、有人编译的时候会报错:

这个主要是执行目录问题,一定要在$GOPATH/src/项目/目录下,用gobuild执行,gobuild后边不要有任何文件名。

或者用gorun.运行,或者goruntest,test是项目名。不能用goruntest.go。

4、还有人报这个错:test.go文件里的cgoLDFLAGS:-ldl这一行不要删掉。

第一次开发Go程序,使用Goland过程中遇到的一些问题,开发的Go后台需要使用到Windows的一个32位DLL动态库,此为原由,整个过程如下。

在按照上述方式配置好环境,并尝试使用CGO加载DLL时,执行GOLAND的DEBUG提示如下。

经过搜索猜测,是目标机器架构选择错误导致的。

但是在环境配置中,已经正确的选择了Arch为386,尝试使用liteIDE或者直接使用命令行编译,都能够正常编译。唯独使用GoLand不行。

看现象应该是设置没有生效,最后尝试在Run/Debug Configurations再次设置Go env解决此问题。步骤如下:

再次点击debug,发现debug失败,提示如下内容。

这是因为,goland在debug时使用的是dlv插件,该插件还不支持32位程序的调试,直接执行run就可以了。

在使用命令行编译go程序时,可以使用go env命令查看当前编译环境设置。

假如需要修改 GOARCH为386,继续输入命令行 set GOARCH=386 即可,如果重新打开cmd终端,则需要重新设置。所以如果使用命令行编译,可以写一个bat文件,每次都自动先把环境设置好。

揉了揉眼睛再次确认,没错了,确实报错了,那屏幕上每个红色的字符都仿佛在嘲笑的我的粗浅的知识和自负的勇气。

我用颤抖的手指敲了几下键盘,在Google上搜索着这个错误,在反复浏览了48万毫秒后,自信的笑容逐渐在脸上浮现了出来,对的,没有错,我找到答案了。你也好奇答案是什么对吗? 且听我慢慢道来:

我们只需要使用 chown 命令将 /usr/local/go/pkg/darwin_amd64/ 的权限变更为登录用户即可,具体执行命令如下:

那么问题来了,如何查看当前的 [用户名] 呢?执行 whoami 命令即可:

那么我们最终执行的命令就是:

好了,再次按下 Command + R 执行项目,发现顺畅的如同久逢甘霖的大地和瞬间通畅的便秘,怎一个爽字了得。

不过,好像有个什么问题被我们漏掉了,为什么在之前的老Mac电脑上搭建Go的开发环境没有遇到过这个问题呢? 仔细查了一下,这是一个Golang/go的一个Bug,是因为VSCode Go扩展程序使用 -i 选项导致的。有兴趣的同学可以自行查阅Issue: golang/go#37962

如果这个方案解决了您的问题,请帮忙点赞♥️,让其他同学更直观的看到这个解决方案是有效的。