过一会儿,我想再玩一下FFI 库在回答和一个教程作者为 Henri Menke。
我运行的是 archlinux 最新系统,其中安装了 TeXLive 2021 vanilla,并且是最新版本。
不幸的是,运行以下最小示例:
\documentclass{minimal}
\usepackage{luacode}
\begin{luacode*}
local ffi = require("ffi")
local gsl = ffi.load("gsl")
\end{luacode*}
\begin{document}
\end{document}
失败:
christophe@cesium /tmp % lualatex --shell-escape t.tex
This is LuaHBTeX, Version 1.13.2 (TeX Live 2021)
system commands enabled.
(./t.tex
LaTeX2e <2021-11-15>
L3 programming layer <2021-11-22>
(/usr/local/texlive/2021/texmf-dist/tex/latex/base/minimal.cls
Document Class: minimal 2001/05/25 Standard LaTeX minimal class
) (/usr/local/texlive/2021/texmf-dist/tex/lualatex/luacode/luacode.sty
(/usr/local/texlive/2021/texmf-dist/tex/generic/iftex/ifluatex.sty
(/usr/local/texlive/2021/texmf-dist/tex/generic/iftex/iftex.sty))
(/usr/local/texlive/2021/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
(/usr/local/texlive/2021/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)))[\
directlua]:2: could not load library gsl
stack traceback:
[C]: in function 'FFISUPPORTED'
[\directlua]:2: in main chunk.
\luacode@dbg@exec ...code@maybe@printdbg {#1} #1 }
l.8 \end{luacode*}
我的系统有:
/usr/lib/libgsl.so
/usr/lib/libgsl.so.25
/usr/lib/libgsl.so.25.1.0
/usr/lib/libgslcblas.so
/usr/lib/libgslcblas.so.0
/usr/lib/libgslcblas.so.0.0.0
我尝试对路径进行硬编码,像local gsl = ffi.load("/usr/lib/libgsl.so")
,但仍然得到could not load library /usr/lib/libgsl.so
。
这luatex 手册没有提示:它甚至没有提到库ffi
。我应该使用luaJITtex
吗?说实话,我很困惑。
请注意,luajit
能够找到该gsl
库但也失败了:
christophe@cesium /tmp % luajit -v
LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
christophe@cesium /tmp % cat t.lua
local ffi = require("ffi")
local gsl = ffi.load("gsl")
christophe@cesium /tmp % luajit t.lua
luajit: t.lua:2: /usr/lib/libgsl.so: undefined symbol: cblas_ctrmv
有任何想法吗?
答案1
这GSL 文档有关使用共享库的部分中指出:
要链接到库,您需要指定主库和支持 CBLAS 库,该库提供标准的基本线性代数子程序。
libgslcblas.a
如果您的系统未提供合适的 CBLAS 实现,则库中会提供合适的 CBLAS 实现。
因此,您还必须链接到 CBLAS 库才能使用 GSL。(这不会自动完成,因为您可能希望根据系统使用不同的 CBLAS 库)您可以通过ffi.load
在加载之前运行您选择的 CBLAS 实现来执行此gsl
操作,例如(对于 GSL 捆绑的 cblas):
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
ffi.load("gslcblas") -- Replace with another cblas for better performance
local gsl = ffi.load("gsl")
\end{luacode*}
\begin{document}
\end{document}