如何调用我的linux共享库函数
我有一个.so文件,我想在我的Go代码中调用它的函数 我用另一种语言做了.so和测试,这是我的工作,我如何在Go中调用我的函数? 这是我的代码,我加载库,打印函数结果时只显示内存地址如何调用我的linux共享库函数,linux,go,shared-libraries,Linux,Go,Shared Libraries,我有一个.so文件,我想在我的Go代码中调用它的函数 我用另一种语言做了.so和测试,这是我的工作,我如何在Go中调用我的函数? 这是我的代码,我加载库,打印函数结果时只显示内存地址 package main // #cgo LDFLAGS: -ldl // #include <stdio.h> // #include <dlfcn.h> // #include <stdlib.h> import "C" import ( &qu
package main
// #cgo LDFLAGS: -ldl
// #include <stdio.h>
// #include <dlfcn.h>
// #include <stdlib.h>
import "C"
import (
"fmt"
"unsafe"
)
func main() {
var soName = C.CString("./myLibrary.so")
defer C.free(unsafe.Pointer(soName))
handle := C.dlopen(soName, C.RTLD_LAZY)
var nmFuncao = C.CString("memoWrit")
defer C.free(unsafe.Pointer(nmFuncao))
var fun1 = uintptr(C.dlsym(unsafe.Pointer(uintptr(handle)), nmFuncao))
var fun2 := C.dlsym(handle, nmFuncao)
fmt.Println(handle)
fmt.Println(fun1)
fmt.Println(fun2)
}
主程序包
//#cgo LDFLAGS:-ldl
//#包括
//#包括
//#包括
输入“C”
进口(
“fmt”
“不安全”
)
func main(){
var soName=C.CString(“./myLibrary.so”)
延迟C.free(不安全的指针(soName))
句柄:=C.dlopen(soName,C.RTLD_)
var nmFuncao=C.CString(“备忘录”)
延迟C.free(不安全的指针(nmFuncao))
var fun1=uintpttr(C.dlsym(不安全的.指针(uintpttr(句柄)),nmFuncao))
var fun2:=C.dlsym(句柄,nmFuncao)
fmt.Println(手柄)
fmt.Println(fun1)
fmt.Println(fun2)
}
结果是:
0x2585890
140436609898576
0x7fb9f23f1850
加载后,我如何调用我的“memoWrit”函数?我找到了解决方法,在C中调用库过程
package main
// #cgo LDFLAGS: -ldl
// #include <stdio.h>
// #include <dlfcn.h>
// #include <stdlib.h>
//
// void memoWrit(void *lib) {
// void (*func)(void) = NULL;
// char *error = NULL;
// func = (void (*)(void))(dlsym(lib, "memoWrit"));
// error = dlerror();
// if (func == NULL || error != NULL) {
// fprintf(stderr, "Error no such function or procedure! (%s)\n", error);
// return;
// }
// fprintf(stderr, "procedure 'memoWrit' loaded\n");
// (*func)();
//}
import "C"
import (
"fmt"
"unsafe"
)
func main() {
//The path and name of library file .SO
var soName = C.CString("./myLibrary.so")
//After execute, clear the memory
defer C.free(unsafe.Pointer(soName))
//Open library
handle := C.dlopen(soName, C.RTLD_LAZY)
//Execute C procedure with no params
C.memoWrit(handle)
}
主程序包
//#cgo LDFLAGS:-ldl
//#包括
//#包括
//#包括
//
//作废备忘令状(作废*lib){
//无效(*func)(无效)=无效;
//char*error=NULL;
//func=(void(*)(void))(dlsym(lib,“备忘录”);
//error=dlerror();
//if(func==NULL | | error!=NULL){
//fprintf(stderr,“无此类函数或过程的错误!(%s)\n)”,错误;
//返回;
// }
//fprintf(stderr,“加载了程序'memorwrite'”);
//(*func)();
//}
输入“C”
进口(
“fmt”
“不安全”
)
func main(){
//库文件的路径和名称。SO
var soName=C.CString(“./myLibrary.so”)
//执行后,清除内存
延迟C.free(不安全的指针(soName))
//开放图书馆
句柄:=C.dlopen(soName,C.RTLD_)
//执行无参数的C过程
备忘录(句柄)
}
是否有帮助?