因为科研需要,租借了天河2号超算进行计算,天河2号是Redhat 64位系统,之前已经安装了MATLAB 2014a和Epanet
在Linux的MATLAB中,我已经成功将c代码文件编译成(用mex命令).mexa64文件,但是在运行这个.mexa64文件时,MATLAB却报错了,出现了segmentation violation的错误,然后MATLAB自动退出了。后来我发现这个错误是发生在c文件的" ENopen("TLN.inp","reportFile.rpt",""); " 这个命令里面(ENopen 是Epanet的toolkit里的一个命令),在运行.mexa64文件之前我已经加载了动态链接库:loadlibrary('libepanet','toolkit.h')。以下是我操作的过程:
1. 在此之前已经编译好动态链接库(libepanet.so, libepanet.so.2, libepanet.so.2.11;在压缩包里)
2. 将所需的文件(压缩包里)放置于目标文件夹中
3. 更新环境变量 “export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH”
4. 启动MATLAB “matlab -singleCompThread -nojvm -nodisplay”
5. 加载动态链接库 “loadlibrary('libepanet2','toolkit.h')”
6. 运行mexa64文件 “[objs, constr]=TLN2obj(13*ones(1,8),1)”
结果出现了错误~~
希望有高手可以帮一下忙,会适当给报酬费用~
Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行
-
- 帖子: 1
- 注册时间: 2019-05-18 17:36
Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行
- 附件
-
- 程序运行文件.rar
- 运行程序所需文件
- (259.47 KiB) 已下载 122 次
- astolia
- 论坛版主
- 帖子: 6514
- 注册时间: 2008-09-18 13:11
Re: Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行
loadlibrary加载的到底是libepanet2还是libepanet?
在那行之前用 printf("%lld\n", ENopen) 之类的看一下ENopen这些函数地址到底对不对。从gdb调试TLN2obj.mexa64的结果看,它想跑去执行地址在1这个位置的函数导致段错误。你mex编译的时候,带上-g参数,编译出的东西有调试信息,用gdb查问题会方便得多。参考 http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html
另外我用了dlopen来加载libepanet.so,执行里面的函数是没问题的。实在不行要不你也在TLN2obj.c里直接用dlopen加载试试?
在那行之前用 printf("%lld\n", ENopen) 之类的看一下ENopen这些函数地址到底对不对。从gdb调试TLN2obj.mexa64的结果看,它想跑去执行地址在1这个位置的函数导致段错误。你mex编译的时候,带上-g参数,编译出的东西有调试信息,用gdb查问题会方便得多。参考 http://www.unknownroad.com/rtfm/gdbtut/gdbsegfault.html
另外我用了dlopen来加载libepanet.so,执行里面的函数是没问题的。实在不行要不你也在TLN2obj.c里直接用dlopen加载试试?
代码: 全选
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main() {
int (*ENepanet)(char *, char *, char *, void *(char *));
char *error;
void *handle = dlopen("./libepanet.so", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
ENepanet = dlsym(handle, "ENepanet");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%d\n", (*ENepanet)("TLN.inp", "reportFile.rpt", "", NULL));
dlclose(handle);
return 0;
}