luatex 无法使用 FFI 找到动态共享库

luatex 无法使用 FFI 找到动态共享库

过一会儿,我想再玩一下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}

相关内容