24小时热门版块排行榜    

查看: 1465  |  回复: 10

小强V587

木虫 (正式写手)

[求助] makefile运算两个错误,敬请大神救助,急急急

我是研一做模拟的,物理化学方向,拿到一个计算代码,研究makefile已经一个多月了,现在make以后出现了两个错误。makefile大概是输入一个势能面代码,经过运算输出一个可执行的、名字为  势能面.x.opt   的可执行文件,平台是intel的X86_64。现在有两个错误,请大神解读。下边是shell的部分运算过程:测试的是HN2的一个势能面,正确计算的话会生成ANT-HN2.x.opt的可执行文件,可现在并没有生成。最近两个星期了一点进展也没有,急死了。
ifort    atomdata.o param.o c_traj.o c_struct.o c_term.o c_initial.o c_sys.o c_output.o c_dd.o angmom.o ant.o actionint.o actionint_nt.o adjtemp.o adjpress.o adtod.o arcom.o atomdiatom.o bmat.o brent.o bsstep.o carttojac.o checkfrus.o checkhop.o cnsvangmom.o comgen.o decocheck.o derivs.o diamin.o diapot.o driver.o driverim.o detmtbt.o elecdeco.o erotc.o ewkb.o fileopen.o finalstate.o frag.o fragcom.o func.o gaussq.o geom_opt.o getdvec2.o getdvec.o getgrad.o getgrad2.o getpem.o getrho.o getrhocsdm.o gettemp.o getpress.o gepol_mod.o gepol_unmod.o setupvolume.o volume_interface.o hardwall.o header.o hop.o honey.o ifsame.o ifsame2.o initelec.o initmol.o initrot.o inittrans.o intcart.o intcoord.o integhop.o invmtbt.o lindemann.o liouville.o matprint.o mmid.o momigen.o noang.o nocompp.o normod.o normod-trapz.o period.o periodimage.o pjctmomen.o pjsplit.o popmod.o popnorm.o preatomdiatom.o premol.o pzextr.o radialdist.o ranclucub.o ranclusp.o rancluns.o ranmolcub.o ranrot.o rantherm.o readin.o relenerg.o rijmatr.o rminfrag.o rk4.o rng_int.o rotprin.o rottran.o rtox.o stodeco.o takestep.o takestep2.o trapz.o turn.o turnpt.o utility.o verlet.o vwkb.o xptoy.o gen_prt.o HN2.o -mkl -O3 -L../../sprng2.0/lib /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_ilp64.a /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_thread.a /opt/intel/mkl/10.1.1.019/lib/64/libmkl_core.a -Wl,R/opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_ilp64.a -Wl,R/opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_thread.a -Wl,R/opt/intel/mkl/10.1.1.019/lib/64/libmkl_core.a ../../sprng2.0/lib/libsprng.a -o ../../exe/ANT-HN2.x.opt
ifort: command line error: invalid argument for option '-m'
make[1]: *** [../../exe/ANT-HN2.x.opt] Error 1
make[1]: Leaving directory `/home/cast/user/lyq/ANT16/src/obj_opt'
make: *** [yes_opt] Error 2
之前的编译过程,都是没问题的。错误1的选项“-m”是代码里的参数吗 ,但是我几乎打开过所有的代码,makedile里都没找到M相关的参数;
错误2是makefile提到的,
OBJ = $(patsubst %.f,%.o,$(SRC))
OBJ := $(patsubst %.F,%.o,$(OBJ))
OBJ := $(patsubst %.F90,%.o,$(OBJ))
OBJ := $(patsubst %.for,%.o,$(OBJ))
OBJ := $(patsubst %.f90,%.o,$(OBJ))

EXEDIR:=../$(EXEDIR)
MAKEOPT = -f ../Makefile
all: yes_opt

no_opt:
        $(MAKE) $(MAKEOPT) -C obj targ
yes_opt:
        $(MAKE) $(MAKEOPT) -C obj_opt EXESUFFIX=.opt OPT="$(OPT_FFLAGS)" targ

targ: $(TARG)
不知道怎么错了,也不知道这几句到底什么意思。敬请大神不吝赐教。金币不多,请见谅
回复此楼
努力,证明自己
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖支持 ( 显示支持度最高的前 50 名 )

小强V587

木虫 (正式写手)

现在又有一个错误,求救啊,怎么就没人呢
lfg.c(922): warning #167: argument of type "int *" is incompatible with parameter of type "unsigned int *"
    packed += load_int(packed,4,&rng_type);
                                             ^
这个&符号不兼容,怎么改啊!!
努力,证明自己
4楼2016-05-25 21:27:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通回帖

lijf517

木虫 (小有名气)

你那个ifort的命令的含义是链接自己程序生成的一堆.o格式的目标文件,同时链接一些库文件,最终生成可执行文件。那个命令里使用-mkl来链接mkl库,但是这个格式好像不对。ifort会读取-这个符号后的第一个字母,得到-m这一链接选项,但是ifort编译器里没有-m选项,所以出错了。链接mkl库应该用如下格式: -L$MKL_LIB_PATH -lmkl_core…等。你可以再详细了解下链接mkl库该如何操作

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

2楼2016-05-25 04:08:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小强V587

木虫 (正式写手)

送红花一朵
引用回帖:
2楼: Originally posted by lijf517 at 2016-05-25 04:08:29
你那个ifort的命令的含义是链接自己程序生成的一堆.o格式的目标文件,同时链接一些库文件,最终生成可执行文件。那个命令里使用-mkl来链接mkl库,但是这个格式好像不对。ifort会读取-这个符号后的第一个字母,得到- ...

谢谢你的回复,我大概也猜到了应该是mkl库文件设置出了问题,但是不知道该怎么设置,感觉设置的路径是对的啊。里边有一个问题,是-mkl没有命名过就直接出现了。前边有一个mklroot的路径设置,然后complib里设置的路径调用了这个路径。makefile不是由.f文件编译成.o文件,然后链接.o生成可执行文件吗?-m命令从哪里来的呢?是-mkl没设置对,然后他以为是-mkl是-m打头的命令,是这样吧?

发自小木虫Android客户端
努力,证明自己
3楼2016-05-25 15:30:24
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小强V587

木虫 (正式写手)

都是闲金币少吗??是这样吗??
努力,证明自己
5楼2016-05-26 15:26:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijf517

木虫 (小有名气)

引用回帖:
4楼: Originally posted by 小强V587 at 2016-05-25 21:27:55
现在又有一个错误,求救啊,怎么就没人呢
lfg.c(922): warning #167: argument of type "int *" is incompatible with parameter of type "unsigned int *"
    packed += load_int(packed,4 ...

函数要求输入一个int*的参数,但是你传入的是一个unsigned int*, 这两个参数类型不匹配。

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

6楼2016-05-26 19:50:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijf517

木虫 (小有名气)

引用回帖:
4楼: Originally posted by 小强V587 at 2016-05-25 21:27:55
现在又有一个错误,求救啊,怎么就没人呢
lfg.c(922): warning #167: argument of type "int *" is incompatible with parameter of type "unsigned int *"
    packed += load_int(packed,4 ...

与&符号无关。你看下声明load_int函数的头文件中,函数的第一个参数是什么类型的,再看下你调用时传入的packed参数是什么类型的。要传给相同类型才可以,特别是这种指针变量。

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

7楼2016-05-26 19:54:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小强V587

木虫 (正式写手)

送红花一朵
引用回帖:
6楼: Originally posted by lijf517 at 2016-05-26 19:50:36
函数要求输入一个int*的参数,但是你传入的是一个unsigned int*, 这两个参数类型不匹配。
...

非常感谢您的回答,帮助我很多
努力,证明自己
8楼2016-05-26 20:42:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小强V587

木虫 (正式写手)

送红花一朵
引用回帖:
7楼: Originally posted by lijf517 at 2016-05-26 19:54:42
与&符号无关。你看下声明load_int函数的头文件中,函数的第一个参数是什么类型的,再看下你调用时传入的packed参数是什么类型的。要传给相同类型才可以,特别是这种指针变量。
...

谢谢您的回答,对我帮助很大。我现在是初学者,也不知道这个是怎么回事,还请您不吝赐教:
#ifdef __STDC__
int *unpack_rng( char *p)
#else
int *unpack_rng(p)
char *p;
#endif
{
  int doexit=0,i, found, length, k, param;
  struct rngen *q;
  unsigned seed, lag1, lag2;
  unsigned char *packed;
  int rng_type;
  
  packed = (unsigned char *) p;
  
  packed += load_int(packed,4,&rng_type);
  if(strcmp((char *)packed,GENTYPE) != 0)
  {
    fprintf(stderr,"ERROR: Unpacked ' %.24s ' instead of ' %s '\n",  
            packed, GENTYPE);
    return NULL;
  }
  packed += strlen(GENTYPE)+1;
   
  packed += load_int(packed,4,&lag1);
  packed += load_int(packed,4,&lag2);
  packed += load_int(packed,4,&seed);
这是中间的一部分,出错位置出现的load_int也是第一次在代码中出现,在运行时也是警告,但是可以往下运行,结果对错不知道。还请您多帮助
努力,证明自己
9楼2016-05-26 20:48:50
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lijf517

木虫 (小有名气)

不知道load_int函数具体是怎么实现的。从你贴的这段代码来看,这段代码的意思大概是从传入的一组字符串里提取rng_type,lag1,lag2和seed的值。比如传入的是“123 45 678 9",那么这四个变量的值就分别问123,45,678,9。load_int函数应该是每次提取一个整数。这代码里涉及unsigned char, char和unsigned(int)。其中unsigned char取值范围为0~255,char取值范围为-128~127。这两种类型在内存中都占一个字节。unsigned(int)在内存中所占字节与编译器有关,现在一般都是4个字节即32位,取值范围为0~2的32次方-1。普通int的取值范围为-2的31次方~2的31次方-1。把unsigned char赋值给unsigned int或char赋值给int都没问题,因为后者取值范围比前者大,但是反过来就不行,会出错。同样unsigned char和char之间,以及unsigned int和int之间相互赋值也可能会出错,在赋值前必须清楚变量取值范围。你贴的这段代码不全,不是非常清楚其目的,但是感觉用了这么多中类型的变量有点乱,也没必要。你试着把packed=(unsigned char*) p改成packed = p试试。这样就和load_int函数声明的参数类型一致了。我觉得char*足够了,没必要转换成unsigned char*。当然这么改是否合适还要取决于函数load_int的具体实现

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

10楼2016-05-26 23:38:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 小强V587 的主题更新
信息提示
请填处理意见