提问人:Bryan 提问时间:11/7/2023 更新时间:11/7/2023 访问量:52
matlab MEX 文件的导出LD_PRELOAD
export LD_PRELOAD for matlab MEX files
问:
我创建了一个 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 脚本不起作用?我该如何解决?
- 有没有其他更好的方法来解决这个问题?
谢谢!
答:
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)。还将探索适当的链接。谢谢。
评论
LD_PRELOAD
export LD_PRELOAD=/path/lib.so
matlab
LD_PRELOAD=/path/lib.so matlab