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



我有一个。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)
}

结果是:

0 x25858901404366098985760 x7fb9f23f1850

加载后我如何调用我的" memowrite "函数?

我找到了解决这个问题的方法,在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' loadedn");
// (*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)
}

最新更新