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

时间:2019-05-16 10:26:04

标签: julia method-call

ccall一个定制的库,我需要在系统上写下该库的完整路径:

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

我正尝试使用以下相对路径:

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

但是,尽管"$(pwd())/libmylib.so"返回库的正确路径,而ccallpwd返回的是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

2 个答案:

答案 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)