此示例代码之前出现在Aditya 的博客文章,并做了一个小调整。我尝试在 Debian 10 (buster) 上运行它,但失败并出现以下错误。
texlua julia.lua
ERROR: could not load library "/usr/lib/x86_64-linux-gnu/../bin/../lib/x86_64-linux-gnu/julia/sys.so"
/usr/lib/x86_64-linux-gnu/../bin/../lib/x86_64-linux-gnu/julia/sys.so: cannot open shared object file: No such file or directory
我尝试使用默认的 Julia 版本1.0.3+dfsg-4
和当前的不稳定版本1.1.1+dfsg-1
。在这两种情况下,都会产生上面显示的错误。我还使用了来自 Debian 不稳定版本的 TeX Live 2019 的反向移植(Debian 10/buster 刚刚发布了预发布版),以及 LuaTeX 1.10.0。
有两个不同的人报告说此代码在 Arch Linux 上可以正常工作。其中一个是 Aditya。
引用他的聊天记录:
在我的系统上,应该加载的库是 libjulia.so,位于 /usr/lib/libjulia.so
在我的 Debian 系统上,julia/sys.so
已经安装了,但我不确定为什么找不到它。
dlocate julia/sys.so
libjulia1: /usr/lib/x86_64-linux-gnu/julia/sys.so
代码如下。
local ffi = require("ffi")
local JULIA = ffi.load("julia", true)
ffi.cdef [[
void jl_init__threading(void);
typedef struct _jl_value_t jl_value_t;
jl_value_t *jl_eval_string(const char*);
]]
JULIA.jl_init__threading()
code = [[
x = [1 2 3]'
A = [1 0 1; 0 1 1; 1 1 0]
y = x'*A*x
print(y[1])
]]
JULIA.jl_eval_string(code)
答案1
Julia 需要系统运行时才能运行sys.jl
。Julia 解释器附带了此运行时的预编译版本,该版本被转储到 中sys.so
。我认为设置环境变量可以以某种方式影响 路径的解析sys.so
,但我无法找出具体原因。另一种方法是jl_init
使用 将函数指向系统映像的路径jl_init_with_image
。
local ffi = require("ffi")
local JULIA = ffi.load("julia", true)
ffi.cdef [[
void jl_init_with_image__threading(const char *julia_bindir,
const char *image_relative_path);
typedef struct _jl_value_t jl_value_t;
jl_value_t *jl_eval_string(const char*);
]]
JULIA.jl_init_with_image__threading("/usr/lib/x86_64-linux-gnu/julia/", "sys.so")
code = [[
x = [1 2 3]'
A = [1 0 1; 0 1 1; 1 1 0]
y = x'*A*x
print(y[1])
]]
JULIA.jl_eval_string(code)
我将此文件保存为/tmp/julia/test.lua
并使用以下命令在 Docker 容器中运行它:
user@host:~$ sudo docker run -v /usr/local/texlive/2019/:/usr/local/texlive/2019/:ro -v /tmp/julia/:/tmp/julia/ -it --rm debian:buster
root@9903c6e0ca52:/# export PATH=/usr/local/texlive/2019/bin/x86_64-linux/:$PATH
root@9903c6e0ca52:/# apt-get update
[...]
root@9903c6e0ca52:/# apt-get install --no-install-recommends julia libjulia-dev
[...]
root@9903c6e0ca52:/# texlua /tmp/julia/test.lua
23root@9903c6e0ca52:/#
23
最后一行之前是root@9903c6e0ca52
Julia 的输出。这与我从交互式 Julia 会话中获得的结果相同:
julia> x = [1 2 3]'
3×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
1
2
3
julia> A = [1 0 1; 0 1 1; 1 1 0]
3×3 Array{Int64,2}:
1 0 1
0 1 1
1 1 0
julia> y = x'*A*x
1×1 Array{Int64,2}:
23
julia> print(y[1])
23