美文网首页
go语言开发动态库

go语言开发动态库

作者: 笑吧小鸟 | 来源:发表于2020-04-30 00:21 被阅读0次

    go build 可以指定buildmode。分为了多种模式。具体模式如下。

    模式 说明(当前go版本 1.10.3)
    archive 编译成二进制文件。一般是静态库文件。 xx.a
    c-archive 编译成C归档文件。C可调用的静态库。xx.a。注意要编译成此类文件需要import C 并且要外部调用的函数要使用 “//export 函数名” 的方式在函数上方注释(//和export直接不能有空格!!!)。否则函数默认不会被导出。
    c-shared 编译成C共享库。同样需要 import “C” 和在函数上方注释 // export xxx
    default 对于有main包的直接编译成可执行文件。没有main包的,编译成.a文件
    exe 编译成window可执行程序
    plugin 将main包和依赖的包一起编译成go plugin。非main包忽略。【类似C的共享库或静态库。插件式开发使用】

    编译生成 DLL 文件

    MinGW 安装后有一个叫做 Run terminal 的快捷方式,运行后进入命令行方式,进入 exportgo.go 所在目录,运行如下命令:

    go build -buildmode=c-shared -o exportgo.dll exportgo.go ———————————————— 版权声明:本文为CSDN博主「quicmous」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/quicmous/article/details/102772419

    MinGW已经不推荐使用。只有32位版,更新速度也不怎么样。

    MinGW-w64更新最快,基本上gcc更近后几周内就会跟进。32位和64位都提供。

    TDM-GCC,更新速度也不怎么样,同时提供32位和64位。

    涉及64位时,TDM-GCC和MinGW-w64还有一个重要的区别,64位的TDM-GCC既能编译64位binary,也能编译32位binary(用-m32参数)。而MinGW-w64无此能力,你需要装32位和64位的两套MinGW w64 tool chain来编译两种binary。

    MinGW: 编译目标仅兼容 32 位应用程序,最新的官方二进制版本为 GCC 9.2.0。

    MinGW-w64: 衍生自 MinGW 的项目,编译目标兼容 32 位应用程序与和64 位应用程序,最新的官方二进制版本为 GCC 8.1.0。(MingW-W64-builds)

    TDM-GCC: 衍生自 MinGW 和 MinGW-w64 的项目,分为 32 位与 64 位两个版本,32 位版本的编译目标仅兼容 32 位应用程序,64位版本的编译目标兼容 32 位应用程序和 64 位应用程序,最新的官方二进制版本为 GCC 9.2.0。

    注意事项

    • go语言函数中的string,不能直接对应c#中的string
    • c# 定义
        public struct GoString {
            public IntPtr str;
            public Int64 length;
           
            public GoString(string s)
            {
                IntPtr intPtr_S = Marshal.StringToHGlobalAnsi(s);
                str = intPtr_S;
                length = s.Length;
            }
        };
    
        class Inwhtl_DLL
        {
            //[DllImport("C:\\Users\\John\\go\\src\\e.coding.net\\jiftle\\inwarehousetool\\checktool\\checktool.dll", CharSet = CharSet.Auto, EntryPoint = "Check")]
    
            [DllImport("checktool.dll", CharSet = CharSet.Auto, EntryPoint = "Check")]
            public static extern int Check(GoString hfile, GoString file, GoString rptfile);
        }
    
    
           string hfile = "D:/chktool/conf/host-product.json";
                string file = "D:/chktool/conf/checkstd-p201100-v10.json";
                string rptfile = "D:/chktool/report/checkreport.json11";
    
                // ------------------ 执行检测
                //ExecCheckExe();
                int ret = Inwhtl_DLL.Check(new GoString(hfile), new GoString(file), new GoString(rptfile));
                if (ret > 200) {
                    MessageBox.Show(string.Format("检测失败,错误码:{0}", ret));
                    return null;
                }
    
    

    注意事项

    不建议使用GoString,正确的用法,请参考https://www.cnblogs.com/jiftle/p/12817334.html

    参考文章

    原文链接:https://blog.csdn.net/github_33719169/article/details/84826983

    [golang学习笔记-生成windows平台的dll文件]https://blog.csdn.net/qq_30549833/article/details/86157744

    Golang 编译生成 DLL 文件
    C# 结合 Golang 开发

    相关文章

      网友评论

          本文标题:go语言开发动态库

          本文链接:https://www.haomeiwen.com/subject/vycawhtx.html