如何在 Julia ccall 中指定相对库路径?

How to specify a relative library path in Julia ccall?

ccall自定义库,我需要记下系统上的库完整路径:

j = ccall((:add3, "[FULL_PATH]/libmylib.so"), Float32, (Float32,), 2)

我正在尝试改用相对路径:

j = ccall((:add3, "$(pwd())/libmylib.so"), Float32, (Float32,), 2)

但是,虽然 "$(pwd())/libmylib.so" returns 是库的正确路径,但 ccallpwd returns 和 TypeError: in ccall: first argument not a pointer or valid constant expression, expected Ptr, got Tuple{Symbol,String}.

那么,如何调用与 Julia script/current 工作目录位于同一文件夹中的库?

我很困惑,因为根据 Windows 中的 this thread 似乎有效,即使 ccall 的文档指定:

Note that the argument type tuple must be a literal tuple, and not a tuple-valued variable or expression.

有关信息,我在 Ubuntu 18.04 并且库已使用

实现

mylib.c:

float add3 (float i){
 return i+3;
}

mylib.h:

#ifndef _MYLIB_H_
#define _MYLIB_H_

extern float get2 ();
extern float add3 (float i);

编译 (gcc):

gcc -o mylib.o -c mylib.c
gcc -shared -o libmylib.so mylib.o -lm -fPIC

像往常一样,我只是在 SO 上发帖后才找到解决方案。似乎设置问题有助于更好地定义问题。

无论如何,解决方案是首先使用 cglobal 获取函数指针 - 我可以在其中使用 pwd() - 然后使用带有函数指针的 ccall 方法:

f = cglobal((:add3, "$(pwd())/libmylib.so"))
j = ccall(f, Float32, (Float32,), i)

据我所知这是最常用的模式:

const mylib = joinpath(pwd(), "libmylib.so")
j = ccall((:add3, mylib), Cfloat, (Cfloat,), 2)

请注意 "flux" 中的 pwd 可能比您想要的库路径多一些,最好将其与文件相关联,例如

const mylib = joinpath(@__DIR__, "libmylib.so")

其中 @__DIR__ 扩展到文件本身的目录。