我创建了一个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脚本不工作?我如何修复它?
- 有没有其他更好的方法来解决这个问题?
谢谢你,谢谢
1条答案
按热度按时间eanckbw91#
这里的问题是shell脚本,而不是MATLAB。你的脚本
export
将这些变量放入运行该脚本的shell中,但是你调用它的方式,它不能修改调用脚本,所以当你启动MATLAB时,这些值就丢失了。你可以通过“sourcing”shell脚本来解决这个问题,它执行脚本的行,就像你在提示符处键入它们一样。像这样:字符串
最好还是正确地链接你的MEX文件,这样就没有必要了。(通过设置一个RPATH或其他什么)