Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行

OOo,TeX,KO,ABI,GIMP,Picasa,ProE,QCAD,Inkscape,Kicad,Eagle
回复
summerMiao
帖子: 1
注册时间: 2019-05-18 17:36

Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行

#1

帖子 summerMiao » 2019-05-18 17:43

因为科研需要,租借了天河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)”
结果出现了错误~~

希望有高手可以帮一下忙,会适当给报酬费用~
segmentation fault
segmentation fault
segmentation violation.png (7.39 KiB) 查看 5056 次
在这一行命令出现错误
在这一行命令出现错误
c文件.PNG (6.69 KiB) 查看 5056 次
附件
程序运行文件.rar
运行程序所需文件
(259.47 KiB) 已下载 122 次
头像
astolia
论坛版主
帖子: 6514
注册时间: 2008-09-18 13:11

Re: Linux运行mexa64文件出现segmentation fault, Epanet toolkit命令无法运行

#2

帖子 astolia » 2019-05-21 11:03

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加载试试?

代码: 全选

#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;
}
回复