Go语言编译成dll,go语言编译成exe

如何在Go语言中调用DLL

关键是 lpOnRecvCardEvent 这个函数的第二个参数是个 C++ 指针。 楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。 正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。 由于楼...

专注于为中小企业提供成都网站设计、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业辉县免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千余家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

如何方便的一次更新golang的所有第三方包

GO语言的包估计是不能直接调用的,这个我没试过。不过编译成DLL的库绝对是可以调用的,或者直接直接用系统命令调用编译完成的可执行程序。

如何编译生成dll

使用VC下的cl和link手工创建dll并实现函数导入

1、创建dll头文件:

/*

* dllmain.h

*/

#ifndef _DLLMAIN_H

#define _DLLMAIN_H

int getNumber();

#endif

2、创建dll源文件:

/*

* dllmain.c

*/

#include "dllmain.h"

int getNumber()

{

return 10;

}

3、 创建def文件:

; export.def

LIBRARY MY_DLLMAIN ; MY_DLLMAIN 将成为生成的dll的名称

EXPORTS

getNumber @1 ; 这个名称即为函数的实际导出名称 @1为函数的导出编号

4、生成dll文件:

cl dllmain.c /c

link /def:export.def /dll dllmain.obj

这时,工程中已经包含了 dllmain.h dllmain.c export.def dllmain.obj dllmain.lib dllmain.exp MY_DLLMAIN.dll 其中,后4个文件是编译链接过程中生成的文件

5、创建dlltest.c:

/*

* dlltest.c

*/

#include stdio.h

#include "dllmain.h" //dll库的头文件

#pragma comment(lib,"dllmain.lib") //dllmain.lib即是上一步生成的文件

int main()

{

printf("%dn",getNumber());

}

6、编译、链接dlltest.c

cl dlltest.c /c

link dlltest.obj

注意:这里dllmain.lib和dllmain.h应该和dlltest.c在同一个目录中。此步的结果将生成 dlltest.exe

7、运行:

dlltest

这时,系统将载入my_dllmain.dll这个动态链接库,将调用其中的getNubmer函数。

如何使用go调用dll函数

和golang代码一样,照抄,但得换成byte类型即可。

func INT8FromString(s string) ([]byte, error) {for i := 0; i len(s); i++ { if s[i] == 0 { return nil, nil }}return []byte(s), nil}func StringToINT8(s string) []byte {a, err := INT8FromString(s)if err != nil { panic("syscall: string with NUL passed to StringToINT8")}return a}func StringToINT8Ptr(s string) *byte { return StringToINT8(s)[0] }

然后就可以调用了。

retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));

请不要传空值,可以用空格代替之。

最后实例代码,补充完成

items := "string...."; // 字符 类似 *charbuffer := make([]byte, 1024) // 指针位置retGet, getproc, geterr := g1.Call( uintptr(ret), uintptr(unsafe.Pointer(buffer[0])), uintptr(1024), uintptr(unsafe.Pointer(StringToINT8Ptr(items))));

goland,cgo加载32位DLL遇到的问题

第一次开发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文件,每次都自动先把环境设置好。

分享题目:Go语言编译成dll,go语言编译成exe
URL地址:https://www.cdcxhl.com/article14/dsicoge.html

成都网站建设公司_创新互联,为您提供品牌网站设计品牌网站建设服务器托管云服务器网站营销电子商务

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司