如何在 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 是库的正确路径,但 ccall
与 pwd
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__
扩展到文件本身的目录。
到ccall
自定义库,我需要记下系统上的库完整路径:
j = ccall((:add3, "[FULL_PATH]/libmylib.so"), Float32, (Float32,), 2)
我正在尝试改用相对路径:
j = ccall((:add3, "$(pwd())/libmylib.so"), Float32, (Float32,), 2)
但是,虽然 "$(pwd())/libmylib.so"
returns 是库的正确路径,但 ccall
与 pwd
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__
扩展到文件本身的目录。