大家都知道Go链接库系统很难用。 不同Go版本的编译版本不兼容go 源码编译目标,仅支持GNU,无法编译Windows上的dll和lib。
去代码
编译后的代码如下:
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位。
将生成的.h文件包含在C++代码中,通过cmake中的include_directories指定包含路径,通过target_link_libraries指定要链接的.a文件。
注意
Go编译链接库的组件cgo依赖于GCC,因为GCC支持的平台与Go对象编译产品的平台相关。 一般来说,如果Go要编译32位的链接库,GCC也用32位比较方便,C++端也用32位。 否则需要指定一堆参数,做一些配置,会比较麻烦。
ps:我们来看看GO是如何使用静态链接库来编译生成可执行文件的。 它使用第三方.a文件,并且没有源代码构建。
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教程之前的文章或者继续浏览下面的相关文章。 希望大家以后多多支持甜甜圈教程!