如何调用我的linux共享库函数

如何调用我的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

我有一个.so文件,我想在我的Go代码中调用它的函数

我用另一种语言做了.so和测试,这是我的工作,我如何在Go中调用我的函数? 这是我的代码,我加载库,打印函数结果时只显示内存地址

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过程
备忘录(句柄)
}
是否有帮助?