从程序调用子例程时未定义的引用错误

时间:2018-06-14 08:07:39

标签: fortran

我有一个主程序,但我想将它用作子程序。因此,我在其中定义了一个子程序

Program main
contains     
subroutine ram_cpl    
.    
.    
.
end subroutine ram_cpl 
end program main

我应该将它链接到可执行文件exe1,然后进一步用于某些外部程序。我正常exe1但是当我在位于不同目录的外部程序中调用此子程序时,我收到错误

  

未定义对`ram_cpl'

的引用

我认为问题是在链接中发生的,因为我应该将此子例程声明为public,或者应该正确地完成链接。

但是我只能在模块中使用PUBLIC语句,我还检查了用于链接的命令行,但我没有得到任何线索。

/usr/local/bin/mpif90 -frepack-arrays -O3 -ftree-vectorize -ftree-loop-linear -funroll-loops -w -ffree-form -ffree-line-length-none -frecord-marker=4 -fconvert=big-endian -I.. master.o -o exe2 -L.. ../main.o

其中main.o是包含子例程的已编译程序,而master是另一个调用它的程序。 exe2是我想要的可执行文件。

此命令行可以与其他程序一起正常运行,我也尝试将program main替换为module main,但它又给了我一个错误。

1 个答案:

答案 0 :(得分:3)

您的子程序内部指向声明它的程序。你不能从其他任何地方打电话。

如果要从多个位置调用子例程,请将其放在模块中,不要将其设置为内部。现代Fortran中的所有子程序都应该放在一个模块中,除非你有充分的理由将它们放在别处。 在从它调用子程序之前,你必须use模块。

您也可以将其设为外部(end program之后),但该模块更好,更现代化。外部子程序与任何其他子程序一样,它只是在任何其他程序单元之外。应在调用代码中使用external语句(通常不需要)。

此外,您无法同时编译两个程序。只允许一个主程序。