2010-07-29 304 views
3

我不是Fortran程序员(只是一个很短的经验),但我需要编译一个部分写在F77中的程序。有人在我之前编译了Absoft编译器,但现在我需要在g77的另一台机器上重复该过程。对于Absoft公司,makefile文件有F77:使用g77编译的程序问题通常使用Absoft编译器进行编译

f77 -f -w -O -B100 -B108 -c *.f 
mv *.f flib && mv *.o olib 
f77 -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH -lfpvm3 -lpvm3 -L$ABSOFT/lib -lU77 

我已经修改了这些行是

g77 -w -O -B100 -B108 -c *.f 
mv *.f flib && mv *.o olib 
g77 -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH -lfpvm3 -lpvm3 -lgfortran -lgfortranbegin 

,但我得到了以下错误消息

somefile.f:(.text+0x93): undefined reference to `for_open' 
somefile.f:(.text+0xf4): undefined reference to `for_write_seq_fmt' 
somefile.f:(.text+0x128): undefined reference to `for_write_seq_fmt_xmit' 
somefile.f:(.text+0x454): undefined reference to `for_read_seq' 

我该如何解决这个问题?


UPDATE1

如果我添加-libifcore到最后一行(连接器)的结束,然后我得到

/usr/bin/ld: cannot find -libifcore 

我已经找到了库

$ find /opt/intel/* -name 'libifcore*' 
/opt/intel/fce/9.1.036/lib/libifcore.a 
/opt/intel/fce/9.1.036/lib/libifcore.so 
/opt/intel/fce/9.1.036/lib/libifcore.so.5 
/opt/intel/fce/9.1.036/lib/libifcore_pic.a 
/opt/intel/fce/9.1.036/lib/libifcoremt.a 
/opt/intel/fce/9.1.036/lib/libifcoremt.so 
/opt/intel/fce/9.1.036/lib/libifcoremt.so.5 
/opt/intel/fce/9.1.036/lib/libifcoremt_pic.a 

但即使我在源目录中执行以下操作ectory

$ export PATH=$PATH:/opt/intel/fce/9.1.036/lib/ 
$ ln -s /opt/intel/fce/9.1.036/lib/libifcore.so 

找不到它。

而且,在同一台机器在那里我得到了另一个问题How to pass -libm to MPICC? libimf.so: warning: feupdateenv is not implemented and will always fail

看来,编译器应该找到库,如果需要的话

$ echo $LD_LIBRARY_PATH 
/opt/intel/fce/9.1.036/lib:/opt/intel/cce/9.1.042/lib:/usr/local/lib/openmpi:/usr/local/lib:/usr/lib: 
+2

库的动态链接不依赖于'PATH',而是依赖于'ldd.conf'和'LD_LIBRARY_PATH'的内容。 – dmckee 2010-07-29 23:16:36

回答

0

看来问题出在一个源文件中的错误,这对于Absoft编译器来说不是什么大问题。 g77正在发出警告,但编译该文件并产生原始错误(在问题中提到)而没有二进制文件。

当我试着ifort,该文件的编译被中止,但其他文件被编译,并创建一个二进制文件。

fortcom: Error: somefile.f, line 703: An extra comma appears in the format list. [)] 
    & (1p5e12.3,5h ...,))            
-------------------------^ 
compilation aborted for somefile.f (code 1) 

当我删除了额外的逗号,然后两种编译器编译一切,创建程序,尽管ifort产生了一些警告。

然后,当我试图运行两个二进制文件时,由英特尔公司制作的二进制文件工作正常,但是g77的文件非常奇怪,并没有真正做我想做的。

所以现在原来的问题已经解决了,但是代码并没有在多处理模式下运行,所以这个二进制文件对我来说是不幸的。

1

它看起来像你试图用libifcore链接。

编辑: 您可以通过添加 “-lifcore”到您的编译器选项包括这个库。引述gcc tutorial

一般来说,编译器选项-lname将尝试目标文件与标准库目录库文件“libName.a的”链接。

+0

我已根据您的答案评论更新了我的问题。你能指导我吗? – Andrei 2010-07-29 20:06:04

+0

你想-lifcore语法将ib删除,我很确定 – deinst 2010-07-30 01:28:15

+0

是的,他可以添加libifcore到他的链接上面建议的,但我怀疑这是整体解决方案。如果没有任何意义,编译并链接到g77的Fortran程序将链接到英特尔Fortran库。是否使用ifort预编译的其他库之一?这可能是链接寻找英特尔库的原因。那么如果你有源代码,最好用相同的Fortran编译器重新编译。或者,也许g77对这些例程使用相同的名称,libifcore与它无关。 – 2010-07-30 01:55:24

2

Absoft接受了Fortran 77的扩展版本,该扩展版本与g77接受的Fortran 77的扩展版本不完全兼容。

所以不能保证你可以这样做而不需要编辑代码。我似乎记得Absoft编译器接受了一个不能用g77复制的方便的初始化语法。

+0

在源代码中,我看到了关于g77的一些注释,并且代码是分布式的,所以我得出结论:如果编译人员知道他/她正在做什么,那么它可以用g77编译。我的问题是我不知道。我相信解决方案是一个链接合适的库的问题。 – Andrei 2010-07-29 19:54:52

+0

@Andrei:啊。这让你最后一次*我*试图做到这一点......我会留下答案,虽然我的情况下有人来看看谁是在不太开心的情况下。 – dmckee 2010-07-29 23:14:50

1

如果您想使用g77编译&链接,最简单的方法是使用命令“g77”。 (f77在您的计算机上调用了哪些编译器?尝试使用“f77 -v”或类似命令查找...)它应该自动查找g77 Fortran特定的库。您不需要明确链接到Fortran库,特别是不需要gfortran库,这是一个不同的编译器。你也可以用gfortran编译&链接 - 它可能会认识到源代码是Fortran 77,并且如果文件具有正确的文件类型,就会适当地编译,否则你将不得不使用选项 - 对于这个编译器,使用命令“ gfortran”。

对于g77和gfortran,它不应该需要英特尔库 - 也许f77连接到计算机上的英特尔编译器ifort?

稍后编辑:

我建议先尝试一些更简单的方法来测试您的设置。

试试这个FORTRAN 77程序作为文件 “junk.f”

C234567 
     write (6, *) "Hello World" 
     stop 
     end 

试试这个命令:

G77 junk.f -o junk.exe

通过运行它

./junk.exe

这将测试g77是否正在工作。

+0

对不起,我没有明确写过,'f77'命令链接到'g77'。我会更新我的问题。我认为Warewulf集群有些奇怪,如果用'ld'来考虑我的另一个类似的错误信息的问题。 – Andrei 2010-07-29 22:06:11

+0

我刚刚尝试过使用'ifort' - 它也没有找到'libifcore'。我猜在库路径变量等方面有些问题。 – Andrei 2010-07-29 22:21:20

+0

我可以用'g77'和'ifort'编译'junk.f',并且这个程序在两种情况下都可以工作。 – Andrei 2010-07-30 08:52:44

1

你为什么要用g77而不是gfortran? 你是什么意思与多处理? openmp还是矢量化的?

你可以在gfortran编译器中使用openmp,当你想像ifort编译器一样使用向量模式时,你必须在编译器选项中明确指定sse。

相关问题