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

标签 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返回类型错误:在 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/

相关文章:

windows - 为什么我们不能使用 CALL :label command in the FORFILES script?

arrays - 在 Julia 中仅用另一个数组的值替换数组中的零

parallel-processing - 你能在没有特殊数组的情况下在 Julia 中并行化不精确的雅可比计算吗?

Java调用方法返回值作为switch case值

javascript - 如何将 `RegExp.test` 部分应用于字符串?

java - 方法不返回给用户(继承)

java - 无法理解这个输出

julia - 为什么这里有一个红色的警告类型?

julia - 两组各有 2 个向量的散点图

julia - Julia 中的特征向量——结果不如 Mathematica 精确