在使用golang 调用c语言库,遇到提示库文件不存在,自己的解决方法

首先,此解决方案是我自己遇到的,不代表普适,只是提供一种思路。我的C语言代码是直接嵌入go代码中的。

先看我的项目文档结构:include文件夹里是openssl的头文件,lib文件里是C的动态库,service里面有C的调用。

service中的C代码调用部分代码如下:

/*
#cgo CFLAGS : -I../include
#cgo windows LDFLAGS: -L../lib -llibeay32 -lssleay32 -lWS2_32

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>

#include <winsock2.h>

#include "openssl/rsa.h"
#include "openssl/crypto.h"
#include "openssl/x509.h"
#include "openssl/pem.h"
#include "openssl/ssl.h"
#include "openssl/err.h"
...
...
*/
import C

可以看到CFLAGS是设置头文件路径,LDFLAGS是设置库文件。在配置这两个变量过程中,注意与自己的文件路径相对应,保证正确。尤其注意c代码注释完后紧跟import C ,不要在中间添加其他东西。这里的import C 实际上是伪包,跟我们经常调用的import不一样,在之后c代码调用过程中,只要在函数前加上C就可以了,具体cgo可以参考官方文档。

来说说我遇见的问题吧:

整个项目在编译时通过了,执行时却提示找不到***.dll文件。重装过mingw64(因为要用到gcc),重装过go ,无济于事。。。

经过摸索,最终解决:

1.检查自己的go的环境变量的系统变量中GOROOT,和GOPATH路径是否正确,Path变量中是否加入"%GOROOT%\bin",继而检查用户变量中是否有关于go环境的设置,有的话请删掉(系统配过变量就不用配用户的了,我是系统变量配置正确,但是用户变量里无缘无故多出来了gopath变量,而且还是错的,那就干脆不配用户变量喽直接删掉),在安装go的时候可能有些默认设置吧,此时问题解决

2.如果上面还解决不了的话,就把lib库文件里的东西全放在根目录下试试。

注意:在你自己使用Cgo的时候gcc很重要哦,如果没有mingw64,就安装最新的Git,它本身就带有mingw64,并确保有gcc。

我的语言组织能力不强,没说清楚的地方请大家见谅,而且因为一些特殊原因无法将全部代码提供给大家参考,请海涵。也可能你出现的问题跟我的一样,但是原因不一样,在这里也只是给大家能够扩展一下解决思路,希望对你有所帮助。


猜你喜欢

转载自blog.csdn.net/yyh4everOrz/article/details/80868191