我有一个FORTRAN源代码,由许多不同的.F和.h文件组成.我需要从中构建一个可执行文件,但是我遇到了一些问题.我到目前为止生成的makefile(由于我是新手,可能有错误)是:
# compiler
FC = /usr/bin/gfortran-4.5
# compile flags
FCFLAGS = -g -c -fdefault-real-8 -fbacktrace -fno-align-commons
# link flags
FLFLAGS = -g -fbacktrace
# source files and objects
SRCS = $(patsubst %.F, %.o, $(wildcard *.F)) \
$(patsubst %.h, %.mod, $(wildcard *.h))
# program name
PROGRAM = blah
all: $(PROGRAM)
$(PROGRAM): $(SRCS)
$(FC) $(FCFLAGS) $@ $<
%.o: %.F
$(FC) $(FLFLAGS) -o $@ $<
%.mod: %.h
$(FC) $(FLFLAGS) -o $@ $<
clean:
rm -f *.o *.mod
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试制作程序时,我遇到了大量未定义的引用错误.我的意思是,在第一个编译的.F文件中的每个函数和子例程调用都会返回一个未定义的引用错误.我认为这是因为gfortran试图链接文件而不是仅编译它们然后在最后进行链接,但我认为'-c'选项应该可以防止这种情况.
更新:
正如评论者指出的那样,我混淆了编译和链接标志.此外,您不应该编译*.h文件.这是最新的,更正的makefile:
# compiler
FC …Run Code Online (Sandbox Code Playgroud) 我试图通过使用gfortran从源代码构建它来获得遗留的FORTRAN代码.我终于能够成功构建它,但现在我运行时遇到了越界错误.我使用gdb并将错误跟踪到使用loc()内在函数的函数.当我尝试打印值时loc(ae),使用ae作为我的整数值,我得到错误"No symbol"loc"in current context".我尝试使用ifort 11.x进行编译并使用DDT进行调试并得到相同的错误.对我来说,这意味着编译器对内在函数一无所知.
一点点阅读显示,内在内在不是F77标准的一部分,所以也许这是问题的一部分.我在下面发布了内在的定义,但我不知道如何在我的代码中实现它,因此可以使用loc().
有什么建议或我误解了我的问题?因为gfortran和ifort由于越界错误而在同一个地方崩溃,但是使用loc()的函数在两个编译器之间返回相同的大数.如果两个编译器都为loc返回相同的值,则loc()将无法工作似乎有点奇怪.
用法:
iaddr = loc(obj)
哪里:
obj是一个变量,数组,函数或子程序,其地址是通缉的.iaddr是一个地址为"obj"的整数.地址格式与LARn指令存储的格式相同.
描述:
LOC用于获取某些东西的地址.返回的值在Fortran中并不真正有用,但可能需要GMAP子例程或非常特殊的调试.
我有一个.F和.H文件的集合,构成FORTRAN代码.我遇到麻烦来编译.H文件..H文件包含一堆公共块.其中一个.H文件的示例是:
*AC HEAD
c HEAD 1
common/blah/ x(25), y, z(25), p(25,mnv), HEAD 2
1 t(25,mx), d(25,mnv) HEAD 3
c HEAD 4
ETC...
Run Code Online (Sandbox Code Playgroud)
当我在谷歌搜索答案时,据说.h文件是c/c ++文件,但它们看起来不像是用c/c ++编写的.gfortran似乎也认为它们是C文件.
当我尝试编译时:
gfortran-4.5 -fdefault-real-8 -fbacktrace -fno-align-commons HEAD.h
我得到错误:
cc1: warning: command line option "-fdefault-real-8" is valid for Fortran but not for C
cc1: warning: command line option "-fbacktrace" is valid for Fortran but not for C
cc1: warning: command line option "-fno-align-commons" is valid for Fortran but not for C
HEAD.h:1:5: error: expected ‘=’, ‘,’, ‘;’, …Run Code Online (Sandbox Code Playgroud)