如何在Julia中调用共享库中动态可变的导出函数指针?
在Julia中调用共享库导出的动态函数指针
当共享库仅导出指向未导出函数的函数指针,且该指针可能被库自身动态修改时,你需要先读取指针变量的当前值,再用该值调用目标函数,具体实现如下:
核心步骤
- 通过
Libdl.dlsym获取导出的函数指针变量的地址(注意:这是变量的地址,而非直接的函数地址) - 从该地址读取当前的函数指针值(因指针可能被动态修改,建议每次调用前重新读取)
- 用
@ccall调用读取到的最新函数指针
基础场景示例
对应你给出的C代码场景:
static void funName(void); void (*funPtr)(void)=funName;
Julia中的调用代码:
using Libdl # 打开目标共享库 libHnd = Libdl.dlopen("/Path/To/Lib.so") # 获取导出的函数指针变量的地址 funPtrAddr = Libdl.dlsym(libHnd, "funPtr") # 读取当前函数指针值(每次调用前读取,确保用最新值) funPtr = unsafe_load(Ptr{Ptr{Cvoid}}(funPtrAddr)) # 调用目标函数 @ccall $funPtr()::Cvoid
动态更新场景优化
如果函数指针会被库频繁修改,可以封装成工具函数,自动每次读取最新指针:
# 封装后直接调用即可,无需手动重复读取指针 function call_funPtr() funPtr = unsafe_load(Ptr{Ptr{Cvoid}}(funPtrAddr)) @ccall $funPtr()::Cvoid end call_funPtr()
libVolk实际场景示例
以libVolk动态选择优化函数的场景为例,假设导出的函数指针为volk_32f_s32f_multiply_32f_a,调用方式如下:
using Libdl libvolk = Libdl.dlopen("libvolk.so") # 获取函数指针变量的地址 volk_func_addr = Libdl.dlsym(libvolk, "volk_32f_s32f_multiply_32f_a") # 封装类型匹配的调用函数 function volk_multiply(dst::Ptr{Cfloat}, src::Ptr{Cfloat}, scalar::Cfloat, len::Csize_t) func_ptr = unsafe_load(Ptr{Ptr{Cvoid}}(volk_func_addr)) @ccall $func_ptr(dst::Ptr{Cfloat}, src::Ptr{Cfloat}, scalar::Cfloat, len::Csize_t)::Cvoid end
内容的提问来源于stack exchange,提问作者tantuni
相关产品推荐
相关产品推荐

