go 源码编译目标-Go如何编译32位GNU静态链接库

大家都知道Go链接库系统很难用。 不同Go版本的编译版本不兼容go 源码编译目标,仅支持GNU,无法编译Windows上的dll和lib。

这次需要将Go代码编译成32位GNU静态链接库。

去代码

编译后的代码如下:

packagemain
import"C"
//exportAdd
funcAdd(a,bint32)int32{
returna+b
}
funcmain(){}

注意go 源码编译目标,我们必须显式地使用//exportAdd注解来注释我们要导入的函数,否则编译后不会形成相应的头文件。

Go 边编译

注意两点,需要启用CGO_ENABLED=1和GOARCH=386。 在Linux中,可以直接设置环境变量,然后执行go。 在Windows中,如果命令行在WSL中,那么更改go.exe的环境变量并不容易。 我的做法是在Makefile中写这样一条命令:

all:
go.exeenv-wGOARCH=386
go.exeenv-wCGO_ENABLED=1
go.exebuild-x-v-buildmode=c-archive.
go.exeenv-wGOARCH=amd64
go.exeenv-wCGO_ENABLED=0

-buildmode=c-archive 表示编译成静态链接库,如果是动态的,就是c-shared的。

编译完成后,生成.h和.a两个文件。

C++ 组连接

需要使用32位编译器或64位编译器,并指定编译目标为32位。

go 源码编译目标-Go如何编译32位GNU静态链接库

将生成的.h文件包含在C++代码中,通过cmake中的include_directories指定包含路径,通过target_link_libraries指定要链接的.a文件。

注意

Go编译链接库的组件cgo依赖于GCC,因为GCC支持的平台与Go对象编译产品的平台相关。 一般来说,如果Go要编译32位的链接库,GCC也用32位比较方便,C++端也用32位。 否则需要指定一堆参数,做一些配置,会比较麻烦。

ps:我们来看看GO是如何使用静态链接库来编译生成可执行文件的。 它使用第三方.a文件,并且没有源代码构建。

go 源码编译目标-Go如何编译32位GNU静态链接库

gobuild和goinstall都需要使用源码进行编译。 有时我们只有 .a 或 .so 文件。 无法获取第三方库的源码。 这种情况下,我们就需要静态链接库编译方式;

上图是实验前的文件分布。

使用静态链接库编译命令:

➜srcgotoolcompile-I../pkg/darwin_amd64/callyx.go
➜srcgotoollink-ocall2-L../pkg/darwin_amd64/callyx.o

实验后文件分发:

从图中我们可以看到可执行文件已经生成了。

总结

至此,这篇关于Go编译32位GNU静态链接库的文章就介绍完了。 更多关于Go编译32位GNU静态链接库的信息,请搜索Dough教程之前的文章或者继续浏览下面的相关文章。 希望大家以后多多支持甜甜圈教程!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 go 源码编译目标-Go如何编译32位GNU静态链接库 https://www.wkzy.net/game/188168.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务