当前位置: 首页 > Linux

golang生成共享对象供其他语言使用

时间:2023-04-07 01:04:34 Linux

golang生成共享对象供其他语言使用LINUXso文件基本概念及命名规则libxmns.so.1.2.31major2minor3releasemajor新增,原有功能接口不能再使用,minor和release返回0minoradded,新添加了一些函数接口,但是原来的函数接口还是可以用的,release返回0release添加,修改一些bug,函数接口不变c-gotemplate-forc,java等编译型语言或者脚本语言packagemainimport"C"import"fmt"//exportSumfuncSum(aint,bint)int{returna+b}//exportGetNamefuncGetName(firstNamestring)string{returnfmt.Sprint(firstName,"-so")}funcmain(){}注意,即使要编译成动态库,也必须有main函数。上面的import"C"必须有并且必须有注释。编译gobuild-buildmode=c-shared-olibhello.so.\libhello.Go使用lua脚本语言调用使用的库:lua2goluajit环境变量配置exportLUA_PATH="~/?.lua;;"exportLUAJIT_LIB=/usr/local/openresty/luajit/libexportLUAJIT_INC=/usr/local/openresty/luajit/include/luajit-2.1exportLUAJIT_HOME=/usr/local/openresty/luajitPATH=$PATH:$LUAJIT_HOME/binexportPATHcalldemolocallua2go=require('lua2go')localexample=lua2go.Load('./libvibrant.so')lua2go.Externs[[externGoInt32Sum(GoInt32a,GoInt32b);]]print(example.Sum(1,100))调用测试luajittest_go.luaplug模式1,golang1.8+支持2,只支持golang模板包mainimport("fmt")funcDCall(){fmt.Println("plugin.so被调用了")}funcDCallWithParam(msgstring){fmt.Println("参数内容为:",msg)}funcmain(){fmt.Println("allgorouteexits")}compilegobuild--buildmode=pluginplugin.gousespackagemainimport("plugin")funcmain(){//加载动态库p,err:=plugin.Open("plugin.so")iferr!=nil{panic(err)}//findFunctionf,err:=p.Lookup("DCall")iferr!=nil{panic(err)}//类型转换后调用函数f.(func())()f2,err:=p.Lookup("DCallWithParam")iferr!=nil{panic(err)}//调用带有参数的函数f2.(func(string))("helloworld,plugin.so")}gobuildmodeDescription'gobuild'和'goinstall'命令采用-buildmode参数,指示要构建哪种目标文件。目前支持的值有:-buildmode=archiveBuildthelistednon-mainpackageages到.a文件中。名为main的包将被忽略。-buildmode=c-archive将列出的主包及其导入的所有包构建到C存档文件中。唯一可调用的符号将是那些使用cgo//export注释导出的函数。只需要列出一个主包。-buildmode=c-shared将列出的主包及其导入的所有包构建到C共享库中。唯一可调用的符号将是那些使用cgo//export注释导出的函数。只需要列出一个主包。-buildmode=default列出的主要包内置到可执行文件中,列出的非主要包内置到.a文件中(默认行为)。-buildmode=shared将所有列出的非主包合并到一个共享库中,在使用-linkshared选项构建时将使用该共享库。包命名主要被忽略。-buildmode=exe构建列出的主要包和它们导入到可执行文件中的所有内容。未命名为main的包将被忽略。-buildmode=pie构建列出的主要包以及它们导入到位置独立可执行文件(PIE)中的所有内容。未命名为main的包将被忽略。-buildmode=plugin将列出的主要包以及它们导入的所有包构建到Go插件中。未命名为main的包将被忽略。