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