zoukankan      html  css  js  c++  java
  • Golang编写Windows动态链接库(DLL)及C调用范例

    一、准备。

    1、GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本。

    2、你的电脑上需要gcc,如果没有的话[点击这里]下载安装,或者问度娘如何下载gcc,有的方法很慢,这是我折腾半天用的最快的方法,下载压缩包解压即可。

    如果有32位版本的需要卸载重装这个64位的,这个很重要。

    装完环境配置一下bin目录到环境变量中,打开命令行工具,输入gcc -v,如果出现以下信息,则配置成功:

    二、编译。

    1、命令很简单,就一行

    > go build -ldflags "-s -w" -o main.dll -buildmode=c-shared main.go

    -s 、-w 指令用于减小动态链接库的体积,-s是压缩,-w是去掉调试信息。-o可以指定生成文件的目录。命令可以简化成如下:

    > go build -o main.dll -buildmode=c-shared main.go

    这句命令执行结束后会在当前目录下生成一个.dll和一个.h文件,至此,编译部分就完成了。

     三 、C调用示例。

    1、编写lib.go,这里有两个地方需要注意:

    (1)import "C"必须加上,编译需要C库的支持,方便类型转换

    (2)//export GetData必须加上,指明该函数导出,而且必须是//export+ 空格+函数名,//和export之间加上空格也不行。

    以上条件不满足编译不出.h文件。

     2、编译,编译成功后目录下会多出一个.dll和.h文件

     

    3、C语言调用

    方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中卸载。

    [注意]:每调用一次 LoadLibrary 函数就应调用一次 FreeLibrary 函数,以保证不会有多余的库模块在应用程序结束后仍留在内存中,否则导致内存泄漏。

     

  • 相关阅读:
    财务自由之路--笔记
    Spring Cloud微服务笔记(一)微服务与云概念
    Java8新特性----Stream
    Docker操作笔记(四)使用网络
    Docker操作笔记(三)数据管理
    Docker操作笔记(二)容器
    Docker操作笔记(一)使用镜像
    信息化领域热词分类分析及解释
    假期第二周总结
    假期第一周总结
  • 原文地址:https://www.cnblogs.com/Kingram/p/12088087.html
Copyright © 2011-2022 走看看