要ccall
自定义库,我需要记下系统上的库完整路径:
j = ccall((:add3, "[FULL_PATH]/libmylib.so"), Float32, (Float32,), 2)
我尝试使用相对路径:
j = ccall((:add3, "$(pwd())/libmylib.so"), Float32, (Float32,), 2)
但是,虽然 "$(pwd())/libmylib.so"
返回库的正确路径,但 ccall
与 pwd
返回类型错误:在 ccall 中:第一个参数不是指针或有效的常量表达式,预期为 Ptr,得到 Tuple{Symbol,String}
。
那么,如何调用与 Julia 脚本/当前工作目录位于同一文件夹中的库?
我很困惑,据this thread在 Windows 中似乎可以工作,即使 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
最佳答案
据我所知,这是最常用的模式:
const mylib = joinpath(pwd(), "libmylib.so")
j = ccall((:add3, mylib), Cfloat, (Cfloat,), 2)
请注意,pwd
的“flux”可能比您想要的库路径要多一些,最好将其与文件相关联,例如
const mylib = joinpath(@__DIR__, "libmylib.so")
其中 @__DIR__
扩展为文件本身的目录。
关于julia - 如何在 Julia ccall 中指定相对库路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56166376/