导出LD_PRELOAD for matlab MEX文件

lmvvr0a8  于 2023-11-21  发布在  Matlab
关注(0)|答案(1)|浏览(169)

我创建了一个MEX可执行文件,只有当我export LD_PRELOAD所有需要的库时,这个文件才能作为matlab函数执行。
我想自动化这个过程,因为它使用了一堆内部制作的库,每次在终端中编写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脚本不工作?我如何修复它?
  • 有没有其他更好的方法来解决这个问题?

谢谢你,谢谢

eanckbw9

eanckbw91#

这里的问题是shell脚本,而不是MATLAB。你的脚本export将这些变量放入运行该脚本的shell中,但是你调用它的方式,它不能修改调用脚本,所以当你启动MATLAB时,这些值就丢失了。你可以通过“sourcing”shell脚本来解决这个问题,它执行脚本的行,就像你在提示符处键入它们一样。像这样:

$ . scripts/preload_matlab_libs.sh
$ matlab

字符串
最好还是正确地链接你的MEX文件,这样就没有必要了。(通过设置一个RPATH或其他什么)

相关问题