24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1763  |  回复: 18

cean

金虫 (职业作家)


[交流] 【求助】f77的ifdef语句

在看一个老的f77程序,其中inc文件有这么几句:
#ifdef BL
      real dd(nbig)
#else
      real dd(1)
#endif

好像是为了省点内存。

但我用g95编译不过去,说第2个dd已经被定义了。

该怎么处理呀?

谢谢
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小木虫(金币+0.5):给个红包,谢谢回帖交流
cean(金币+1): 2010-12-04 20:43:18
ajian04:欢迎交流~ 2010-12-11 10:44:03
这个程序明显需要 cpp 先处理一下,然后才能编译,呵呵……
2楼2010-12-04 19:33:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


ajian04:欢迎交流~ 2010-12-11 10:44:14
引用回帖:
Originally posted by snoopyzhao at 2010-12-04 19:33:31:
这个程序明显需要 cpp 先处理一下,然后才能编译,呵呵……

makefile里有这么一句:
.Inc.inc:
        @if [ -f $*.inc ]; then mv -f $*.inc $*.inc.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.inc

我现在所有的F文件都编译过去了,只剩下几个cpp文件编不过去。

原来的makefile是linux下的,我在xp下用gcc4.5, 肯定makefile改的还没对。

[ Last edited by cean on 2010-12-4 at 21:18 ]
3楼2010-12-04 20:20:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean(金币+1): 2010-12-06 10:30:51
余泽成(金币+1):谢谢参与应助! 2010-12-06 16:31:21
引用回帖:
Originally posted by cean at 2010-12-04 20:20:38:


makefile里有这么一句:
.Inc.inc:
        @if [ -f $*.inc ]; then mv -f $*.inc $*.inc.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.inc

我现在所有的 ...

XP 下也可以有 gnu make 啊,呵呵……

你自己把那几句展开,然后照着处理下就可以了。cpp 也是 gcc 中的吧……
4楼2010-12-04 22:01:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


ajian04:欢迎交流~ 2010-12-11 10:44:31
就是改makefile然后make.

但是xp下不分大小写, 比如这个.Inc.inc:应该是把Inc预处理成inc,但在xp下文件是同名的。

make的好多命令还得搞明白。
5楼2010-12-05 19:14:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
cean(金币+1): 2010-12-06 10:31:25
引用回帖:
Originally posted by cean at 2010-12-05 19:14:10:
就是改makefile然后make.

但是xp下不分大小写, 比如这个.Inc.inc:应该是把Inc预处理成inc,但在xp下文件是同名的。

make的好多命令还得搞明白。

那个把 .Inc.inc 改一下就好了啊,大不了处理完了之后,再改回来就是了……

make 的命令可以看 gnu make 的手册。
6楼2010-12-05 21:24:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


ajian04:欢迎交流~ 2010-12-11 10:44:42
我把小inc改了名,但好像这个前处理语句没执行到。

另外一个.F.f的目标,我改.f成.for,生成了.for文件,但接下去编译是自动用f77了,我的gcc4.5带的是gfortran. makefile里定义了f77=gfortran,但.for的名字就能用f77编吧。按来还得把名字改回.f


.F.f:
        @if [ -f $*.f ]; then mv -f $*.f $*.f.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.f
7楼2010-12-06 10:29:09
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
cean(金币+1): 2010-12-06 19:18:08
ajian04:欢迎交流~ 2010-12-11 10:44:49
你应该贴一个完整的 Makefile 出来,呵呵……

另外,.for 文件可以用 gfortran 来编译,没有任何问题。如果有,那就是源码不够标准,呵呵……
8楼2010-12-06 10:34:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)



ajian04(金币+1):欢迎交流~ 2010-12-11 10:45:09
回的真快。

不好意思贴一大段。

这是其中要插入的一个文件。原来是给linux的,我正试着改成win的。这个是流体程序duns,http://duns.sourceforge.net/home.html

我用的win下的gcc4.5.1是这里的 http://www.equation.com/servlet/equation.cmd?call=fortran

预处理怎么没执行到?

.f和.F两个目标,在win下我必须注释掉一个。

谢谢


#
# This makesystem was constructed on a PII machine running Linux.
# We found we had to use fort77 (front-end to f2c)
# instead of g77/f77 that comes with most distributions, although
# we still link with the g2c directory.  Enjoy.
#

.SUFFIXES:   .Inc  .inc  .o  .F   .C  .f  .cpp  .c

F77     = gfortran
CPP     = gcc -C -x c -P -E -traditional-cpp
CPLUS   = g++
CC      = gcc
LINKER  = gcc
LIBMAKER= ar vr
MKDIR   =mkdir
RM        = del
CP        = copy
#CHMOD   = /bin/chmod

CPPFLAGS = -DFUNDER -DISNAN
#CFLAGS  = -DRANGECHECK
CFLAGS   = -O2
F77FLAGS  = -O2 -w
#CPLUSFLAGS= -DRANGECHECK
CPLUSFLAGS= -O2
LFLAGS    = -Xlinker -Bstatic
SYSLIBS   = -L/usr/lib/gcc-lib/i486-suse-linux/2.95.2 -lg2c -lm
GRAFLIBS  = -lmbgrafic -lgrafic -L/usr/X11R6/lib -lX11
MACH      = pcmach.o
XGROBJ    = Xunderscore.o

#CPREC   = double
#FPREC   = "double precision"
CPREC  = float
FPREC  = real

VERSN   = `2.7`


.Inc.incw:
        @if [ -f $*.incw ]; then mv -f $*.incw $*.incw.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.incw

.for.f:
        @if [ -f $*.f ]; then mv -f $*.f $*.f.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.f

.cpp.c:
        @if [ -f $*.c ]; then mv -f $*.c $*.c.bak; fi
        $(CPP) -D"Include"="#include" -D"Define"="#define" -Dreal=$(CPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.c

#.F.o:
#        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.f
        $(F77) $(F77FLAGS) -c $*.f

#.C.o:
#        $(CPLUS) $(INCLUDE) -Dreal=$(CPREC) $(CPLUSFLAGS) -c $<

.f.o:
        $(F77) $(F77FLAGS) -c $<

.c.o:
        $(CC) $(CFLAGS) -DVERSION=\"$(VERSN)\" -c $<

[ Last edited by cean on 2010-12-6 at 11:03 ]
9楼2010-12-06 10:59:57
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★ ★
余泽成(金币+3):辛苦了! 2010-12-06 16:31:41
cean(金币+2): 2010-12-06 19:03:16
引用回帖:
Originally posted by cean at 2010-12-06 10:59:57:
回的真快。

不好意思贴一大段。

这是其中要插入的一个文件。原来是给linux的,我正试着改成win的。这个是流体程序duns,http://duns.sourceforge.net/home.html

我用的win下的gcc4.5.1是这里 ...

看了一下,这个程序实在是有点儿老了,呵呵……

当然,需要修改也就是 makesystem/Makesystem_linux 这样的文件。里面有几句可能要改一下,但我不保证一定能够正确,我的修改与注释在 #@ 之间。

其它文件应该不涉及这些东西了
CODE:
#
# This makesystem was constructed on a PII machine running Linux.
# We found we had to use fort77 (front-end to f2c)
# instead of g77/f77 that comes with most distributions, although
# we still link with the g2c directory.  Enjoy.
#

#@
#.SUFFIXES:   .Inc  .inc  .o  .F   .C  .f  .cpp  .c
.SUFFIXES:   .Inc  .incl  .o  .F   .C  .f  .cpp  .c .for

#F77     = g77
F77     = gfortran
#@
CPP     = gcc -C -x c -P -E -traditional-cpp
CPLUS   = g++
CC      = gcc
LINKER  = gcc
LIBMAKER= ar vr
MKDIR   = /bin/mkdir -p
RM        = /bin/rm -f
CP        = /bin/cp -f
CHMOD   = /bin/chmod

CPPFLAGS = -DFUNDER -DISNAN
#CFLAGS  = -DRANGECHECK
CFLAGS   = -O2
F77FLAGS  = -O2 -w
#CPLUSFLAGS= -DRANGECHECK
CPLUSFLAGS= -O2
LFLAGS    = -Xlinker -Bstatic
#@
#你需要检查一下你的 gcc 的相应版本,并修改下面这一句
SYSLIBS   = -L/usr/lib/gcc-lib/i486-suse-linux/2.95.2 -lg2c -lm
#下面这个在 windows 下很难搞定吧,呵呵……
GRAFLIBS  = -lmbgrafic -lgrafic -L/usr/X11R6/lib -lX11
#@
MACH      = pcmach.o
XGROBJ    = Xunderscore.o

#CPREC   = double
#FPREC   = "double precision"
CPREC  = float
FPREC  = real

VERSN   = `cat VERSION`


#@
#.Inc.inc:
#        @if [ -f $*.inc ]; then mv -f $*.inc $*.inc.bak; fi
#        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.inc
.Inc.incl:
        @if [ -f $*.incl ]; then mv -f $*.incl $*.incl.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.incl

#.F.f:
#        @if [ -f $*.f ]; then mv -f $*.f $*.f.bak; fi
#        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.f
.F.for:
        @if [ -f $*.for ]; then mv -f $*.for $*.for.bak; fi
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.for
#@

.cpp.c:
        @if [ -f $*.c ]; then mv -f $*.c $*.c.bak; fi
        $(CPP) -D"Include"="#include" -D"Define"="#define" -Dreal=$(CPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.c

#@
#.F.o:
#        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.f
#        $(F77) $(F77FLAGS) -c $*.f
.F.o:
        $(CPP) -D"real_precision"=$(FPREC) $(CPPFLAGS) $(FLOWFLAGS) $< >$*.for
        $(F77) $(F77FLAGS) -c $*.for

.for.o:
        $(F77) $(F77FLAGS) -c $<
#@

.C.o:
        $(CPLUS) $(INCLUDE) -Dreal=$(CPREC) $(CPLUSFLAGS) -c $<

.f.o:
        $(F77) $(F77FLAGS) -c $<

.c.o:
        $(CC) $(CFLAGS) -DVERSION=\"$(VERSN)\" -c $<

10楼2010-12-06 14:19:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


ajian04:欢迎交流~ 2010-12-11 10:45:39
确实辛苦了。先把我剩下的金币献上。

我原来以为我可以不要这个SYSLIBS呢。不过好像只是和取系统时间的几个小函数有关。

GRAFLIBS只是一个简单的画图程序要用到,没什么用,确实可以不要。现在其他的后处理软件强大多了。

这个程序一个主程序是c的,计算都是fortran的。

没事只是想看看我能不能把它在win编过去。至少现在对预处理有了点了解。

我再试试。有一点是.F和.f的目标不能共存,在win下gcc会不理其中的一个的。

谢谢。
引用回帖:
Originally posted by snoopyzhao at 2010-12-06 14:19:10:

#你需要检查一下你的 gcc 的相应版本,并修改下面这一句
SYSLIBS   = -L/usr/lib/gcc-lib/i486-suse-linux/2.95.2 -lg2c -lm
#下面这个在 windows 下很难搞定吧,呵呵……
GRAFLIBS  = -lmbgrafic -lgrafic -L/usr/X11R6/lib -lX11
#@
其它文 ...

[ Last edited by cean on 2010-12-6 at 20:20 ]
11楼2010-12-06 19:15:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

余泽成(金币+1):谢谢参与应助! 2010-12-07 21:27:58
引用回帖:
Originally posted by cean at 2010-12-06 19:15:47:
有一点是.F和.f的目标不能共存,在win下gcc会不理其中的一个的

可能是因为 win 下不区分大小写吧。我当时之所以还保留 .f,好象是原文件中有很多 .f 的文件。你可以加一句类似下面这样的语句,看看可不可以,呵呵……

.f.for:
       mv -f $*.f $*.for
12楼2010-12-06 21:36:32
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
cean(金币+1): 2010-12-07 20:53:24
引用回帖:
Originally posted by snoopyzhao at 2010-12-06 21:36:32:


可能是因为 win 下不区分大小写吧。我当时之所以还保留 .f,好象是原文件中有很多 .f 的文件。你可以加一句类似下面这样的语句,看看可不可以,呵呵……

.f.for:
       mv -f $*.f $*.for

想起来了,还是不行,呵呵……这样,连 .F 的也一起移过去了……
13楼2010-12-06 21:45:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


老老实实给每个文件写了个目标,可以把f预处理成for,然后编译生成的for文件了。

还在试。
14楼2010-12-07 20:56:54
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


引用回帖:
Originally posted by snoopyzhao at 2010-12-06 14:19:10:

#你需要检查一下你的 gcc 的相应版本,并修改下面这一句
SYSLIBS   = -L/usr/lib/gcc-lib/i486-suse-linux/2.95.2 -lg2c -lm

其它文 ...

我的情况是不是应该写:
c:\gcc\i686-pc-mingw32\lib

现在我是能把所有的f都编译过去了,但cpp都不行。

timer.cpp有句Include , 我的c:\gcc\i686-pc-mingw32\include\sys里没有times.h, 倒是有time.h和timeb.h

setsignals.cpp编译错误invalid use of undefined type 'struct sigaction'在31,32行
struct sigaction没定义!

最后一个main.cpp还没到可编译的程度。

实在不行自己写个main.f, timer和setsignals都不要了。
15楼2010-12-08 20:12:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★
ajian04(金币+2):谢谢应助…… 2010-12-11 11:03:14
引用回帖:
Originally posted by cean at 2010-12-08 20:12:17:


我的情况是不是应该写:
c:\gcc\i686-pc-mingw32\lib

现在我是能把所有的f都编译过去了,但cpp都不行。

timer.cpp有句Include , 我的c:\gcc\i686-pc-mingw32\include\sys里没有tim ...

我没有在 windows 下测试这个软件。首先,这个软件在 Linux 的确可以编译过去吗?如果是,那么在 windows 下少的头文件可能是系统依赖的。如果真是这样,可能会比较麻烦,实在不行的话,去掉这个头文件所涉及的内容。

其次,如果你不是在多个体系上使用的话,完成可以不理会预编译,直接把相关的代码写死在里面。当然,如果要改动的很多的话,那还是算了吧,太麻烦了,呵呵……

抱歉,不能帮你什么,呵呵……
16楼2010-12-08 21:34:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)



ajian04(金币+1):楼主也辛苦了,鼓励一下吧,欢迎多多交流…… 我最近也在研究ubuntu10.10,呵呵~ 2010-12-11 11:03:54
引用回帖:
Originally posted by snoopyzhao at 2010-12-08 21:34:42:


首先,这个软件在 Linux 的确可以编译过去吗?..

我在ubuntu10.04下试着编了一下,gcc现成的(应该没gfortran),fortran装了个www.g95.org的, f和c都编译过了,现在连接库时有问题。

那个rh7的makefile里SYSLIBS   = -lg2c -lm,我编译说找不到-lg2c。 这个-lg2c据说是f77的库,供c连f的。这个程序是老了。呵呵。

不过预编译挺有意思。这里是用它生成解决不同问题的源代码。这样可执行文件对要解决的问题等于是优化了的。
17楼2010-12-10 20:27:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


终于编译过去另外一个。主要问题是c主程序调用for子程序的写法问题。
18楼2010-12-13 13:47:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cean

金虫 (职业作家)


★ ★
余泽成(金币+2):鼓励分享经验! 2010-12-13 21:59:51
引用回帖:
Originally posted by snoopyzhao at 2010-12-08 21:34:42:


这个软件在 Linux 的确可以编译过去吗?.

终于在linux和xp下都编译过去了。 学到了两点:

1。预处理。
其实这个话题的标题有误,fortran没有ifdef语句。用预处理把所有的ifdef语句都会处理掉。这时的源代码才需要编译呢。

2。c和f的混合编程
这个程序主程序是main.c,它调用所有的fortran子程序。但是更复杂一点的是还有几个fortran子程序调用time.c。 在xp下为了简化编译,把调time.c的语句c住了。

处理好这两点,编译就过去了。
19楼2010-12-13 20:21:08
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 cean 的主题更新
普通表情 高级回复(可上传附件)
信息提示
请填处理意见