matlab MEX 文件的导出LD_PRELOAD

export LD_PRELOAD for matlab MEX files

提问人:Bryan 提问时间:11/7/2023 更新时间:11/7/2023 访问量:52

问:

我创建了一个 MEX 可执行文件,只有当我拥有所有需要的库时,这个可执行文件才能作为 matlab 函数执行。export LD_PRELOAD

我想自动化此过程,因为它使用了一堆内部制作的库,并且每次在终端中编写都是一项繁琐的任务。export LD_PRELOAD

所以我做了一个 bash 脚本:

#!/bin/bash
echo "PRELOAD MATLAB SCRIPT"

# Specify the folder containing the .so files
so_folder="/path/to/lib"

# Check if the folder exists
if [ ! -d "$so_folder" ]; then
  echo "The folder '$so_folder' does not exist."
  exit 1
fi

echo "Searching in .so folder: $so_folder ..."

# STD library problem from LINUX users only
export LD_PRELOAD=$LD_PRELOAD:/lib/x86_64-linux-gnu/libstdc++.so.6 matlab

# Set DACE library
export LD_PRELOAD=$LD_PRELOAD:/path/to/dace/lib/libdace.so matlab

# Loop through .so files in the folder
for so_file in "$so_folder"/*.so; do
  if [ -f "$so_file" ]; then
    # Set LD_PRELOAD and launch MATLAB for each .so file
    export LD_PRELOAD="$LD_PRELOAD:$so_file" matlab
    echo "Preloading library $so_file to MATLAB..."
  fi
done

然后,我从项目的根目录调用此脚本,之后我还启动了 matlab:

$ bash scripts/preload_matlab_libs.sh

之后,我启动MATLAB,但找不到.so文件,如错误所示。

>> mex_test
Invalid MEX-file '/path/to/project/mex/mex_vsod.mexa64': libdace.so.2: cannot open
shared object file: No such file or directory

Error in mex_test (line 13)
b = mex_vsod(input1, input2)

如果我执行...export LD_PRELOAD

我对 MEX 编译文件有点陌生。因此,我的问题:

  • 为什么 bash 脚本不起作用?我该如何解决?
  • 有没有其他更好的方法来解决这个问题?

谢谢!

MATLAB MEX 共享对象 LD-预加载

评论

0赞 Cris Luengo 11/7/2023
您正在启动一大堆 MATLAB 程序,每个程序都有不同的预加载?我认为您只想启动一次 MATLAB,同时启动所有预加载。但是,最好构建您的 MEX 文件,以便他们可以找到他们所依赖的 SO 文件。对于 libstdc++.so,请使用 MATLAB 版本支持的 GCC 版本,或者删除 MATLAB 附带的 GCC 库,并让它使用您的系统库(很可怕,但它确实有效!
0赞 Bryan 11/8/2023
是的,它只启动了一次 MATLAB。感谢 libstdc++ 提示!
0赞 Cris Luengo 11/8/2023
该变量应该只包含 SO 文件,而不是“matlab”。您在启动 MATLAB 时预加载了 MATLAB 可执行文件?LD_PRELOAD
0赞 Bryan 11/8/2023
我发现它在这里是这样使用的,不过我不是MATLAB专家。你的见解是什么?
0赞 Cris Luengo 11/8/2023
是的,这应该是两个单独的命令,或者是一个命令。在第二种情况下,您启动 MATLAB 时,只需为该程序设置环境变量。在第一种情况下,您为当前 shell 会话设置环境变量,然后启动 MATLAB。export LD_PRELOAD=/path/lib.somatlabLD_PRELOAD=/path/lib.so matlab

答:

1赞 Edric 11/7/2023 #1

这里的问题是 shell 脚本,而不是 MATLAB。您的脚本将这些变量放入运行该脚本的 shell 中,但您调用它的方式无法修改调用脚本,因此在您启动 MATLAB 时,这些值会丢失。您可以通过“获取”shell 脚本来解决此问题,该脚本会执行脚本的行,就像您在提示符下键入它们一样。喜欢这个:export

$ . scripts/preload_matlab_libs.sh
$ matlab

最好正确链接您的 MEX 文件,这样就没有必要了。(通过设置 RPATH 或其他方式)

评论

0赞 Bryan 11/8/2023
这是完全正确的!,在您的答案之后的其他解决方案也可以是在 shell 脚本本身中打开 matlab(因此添加最后一行调用 matlab)。还将探索适当的链接。谢谢。