要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
返回的是TypeError: in ccall: first argument not a pointer or valid constant expression, expected Ptr, got Tuple{Symbol,String}
。
那么,如何调用与Julia脚本/当前工作目录位于同一文件夹中的库?
我很困惑,因为Windows中的this thread似乎可以工作,即使ccall
的文档指定了:
请注意,参数类型元组必须是文字型元组,而不是元组值的变量或表达式。
有关信息,我在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
答案 0 :(得分:1)
据我所知,这是最常用的模式:
const mylib = joinpath(pwd(), "libmylib.so")
j = ccall((:add3, mylib), Cfloat, (Cfloat,), 2)
请注意,pwd
在“ flux”中的数量要比您在库路径中所需的数量多一些,最好将其与文件相关联,例如
const mylib = joinpath(@__DIR__, "libmylib.so")
其中@__DIR__
扩展到文件本身的目录。
答案 1 :(得分:0)
通常,我只有在SO上发布后才找到解决方案。似乎设置问题有助于更好地定义问题。
无论如何,解决方案是首先使用cglobal
获得函数指针-我可以在其中使用pwd()
-然后将ccall
方法与函数指针一起使用:
f = cglobal((:add3, "$(pwd())/libmylib.so"))
j = ccall(f, Float32, (Float32,), i)