go程序生成windows平台下dll和lib方法

目的

​    go程序在一些方面编写优于C/C++,我们可以自己用go写一些小组件用C/C++调用。所以我们需要将go程序源代码编译成Linux平台下.a文件或者Window平台下的dll和lib文件。

环境

- golang:go程序必备环境
- gcc:编译成C语言需要用到的环境,windows下也需下载安装

- vs2015:在windows平台下从.dll文件导出.lib的环境(windows下也可以直接使用dll来运行程序,我习惯加上lib的方式)

步骤

1、编写一个go程序

我们编写一个名为godll.go的程序go

package main

import "C"
import (
    "fmt"
)

//export IntAdd
func IntAdd(a int32,b int32) int32{
    return a+b
}

//export GoPrint
func GoPrint(str string){
    fmt.Print(str)
}

func main() {
}

这个程序需要注意几点:

- 程序注释不能有中文

- package main和func main()必须有,导出的包必须是含有main的
- 导出的函数前面用//export +函数名声明,表示需要导出该函数

- 引用包import "C"

2、编译go程序

**Linux下**

​    我们使用go build命令编译此程序,命令格式为

go build -buildmode=c-archive goflie.go    //替换gofile.go为编译的文件名

执行之后我们会得到.a文件和.h文件,到此Linux下我们就算完成了。接下来步骤都是针对Windows下的

**Windows下**

我们使用go build命令编译此程序,命令格式为

go build -buildmode=c-shared -o gofile.dll gofile.go    //替换gofile为编译的文件名

编译后得到 .dll 和 .h 两个文件。其实windows下此时我们也算完成了,但是我习惯使用有静态库的方式,所以接下来主要利用dll生成lib

3、生成lib文件

​    从dll文件生成lib文件的过程我们需要一个def文件,def文件中描述的是导出的函数列表。因为我们知道dll文件中导出函数列表所以我们可以直接新建一个def文件手写。

​    新建一个def文件,用编辑器打开此文件,添加需要导出的函数列表

LIBRARY
EXPORTS
    IntAdd
    GoPrint

注意函数名的书写一定要和导出函数一样

​    有了def文件我们就可以生成lib文件了,此时我们需要使用vs2015提供的lib.exe文件(路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin)。

​    首先将lib.exe所在目录添加到环境变量的path目录下,然后在cmd下执行以下命令

生成目标64位的命令格式:

lib /def:deffile.def /machine:x64 /out:libfile.lib

生成目标32位的命令格式:

lib /def:deffile.def /machine:x86 /out:libfile.lib

此时lib文件生成就完成了

测试

根据生成的h,dll,lib文件我们使用C/C++测试,新建main.cpp在下面添加代码

#include <stdio.h>
#include "godll.h"
#include <string>

#pragma comment(lib,"goDll.lib")

GoString StringToGostring(std::string str)
{
    GoString gostr;
    gostr.p = str.data();
    gostr.n = str.length();
    return gostr;
}

int main()
{
    GoInt res = IntAdd(5, 4);
    printf("add(5,4)=%d\n", res);
    
    GoPrint(StringToGostring("Test"));
    getchar();
    return 0;
}

编译发现会出错,此时我们需要注释头文件下的三行代码

//typedef __SIZE_TYPE__ GoUintptr;
//typedef float _Complex GoComplex64;
//typedef double _Complex GoComplex128;

编译通过,大功告成!!!

 

参考:https://blog.csdn.net/qq_30549833/article/details/86157744

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值