Este código de exemplo apareceu anteriormente em umpostagem no blog de Aditya, com um pequeno ajuste. Tentei executá-lo no Debian 10 (buster), mas falhou com o seguinte erro.
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
Eu tentei isso tanto com a versão padrão do Julia 1.0.3+dfsg-4
quanto com a versão instável atual 1.1.1+dfsg-1
. Em ambos os casos, isso produziu o erro mostrado acima. Também estou usando um backport do TeX Live 2019 do Debian instável (o Debian 10/buster só tem o pré-lançamento), com LuaTeX 1.10.0.
Duas pessoas diferentes relataram que este código funciona para elas no Arch Linux. Um deles é Aditya.
Para citá-lo no bate-papo:
No meu sistema, a biblioteca que deve ser carregada é libjulia.so e está localizada em /usr/lib/libjulia.so
No meu sistema Debian, julia/sys.so
está instalado, mas não sei por que não foi encontrado.
dlocate julia/sys.so
libjulia1: /usr/lib/x86_64-linux-gnu/julia/sys.so
O código segue.
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)
Responder1
Para funcionar, Julia precisa do tempo de execução do sistema sys.jl
. O interpretador Julia vem com uma versão pré-compilada desse tempo de execução, que é despejada no arquivo sys.so
. Acho que a resolução do caminho sys.so
pode de alguma forma ser influenciada pela configuração de variáveis de ambiente, mas não consegui descobrir como. Outra alternativa é apontar a jl_init
função para o caminho da imagem do sistema usando 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)
Salvei este arquivo como /tmp/julia/test.lua
e executei em um contêiner Docker usando os seguintes comandos:
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:/#
O 23
antes root@9903c6e0ca52
da última linha é a saída de Julia. É o mesmo que recebo em uma sessão interativa de 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