이 예제 코드는 이전에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
. 두 경우 모두 위에 표시된 오류가 발생했습니다. 또한 LuaTeX 1.10.0과 함께 Debian Unstable(Debian 10/buster에는 사전 릴리스가 있음)의 TeX Live 2019 백포트를 사용하고 있습니다.
두 명의 다른 사람들이 이 코드가 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:/#
마지막 줄의 이전은 Julia의 출력 입니다 23
. root@9903c6e0ca52
이는 대화형 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