【发布时间】:2015-08-28 19:06:56
【问题描述】:
我正在尝试编译一些非常古老的代码(1986 年及之前)。此代码引用了一个外部函数。今天的编译器要求更多的代码来完成这项工作。而我一直失败。 我现在创建了一个小的 hello world 程序来演示这个问题。
你好.for
PROGRAM hello
USE func
PRINT *, "Hello World!"
PRINT *, f ()
END PROGRAM hello
func.for
MODULE func
PUBLIC f
CONTAINS
FUNCTION f ()
f='Hello Func'
END FUNCTION
END MODULE
这不仅有一个,而且有两个问题:
- 如何定义返回类型?文档告诉
<type> FUNCTION <function>或FUNCTION <function> () <type>::<something>,但都不起作用。 - 如何让链接器找到函数?
gfortran -c func.for 有效(如果我使用默认返回类型 real)并创建一个 mod 文件但链接不起作用
$ gfortran hello.for
/tmp/ccHNzcXA.o: In function `MAIN__':
hello.for:(.text+0xa4): undefined reference to `__func_MOD_f'
collect2: error: ld returned 1 exit status
__func_MOD_f没有包含在mod文件中,但在o文件中有func.for__func_MOD_f。
有什么想法吗?
谢谢
【问题讨论】:
-
在您的具体简单示例中,您只需将
module..end module放在program..end program语句之前。在一个更复杂的例子中——可能在不同的文件夹中有不同的文件——你有几个选择。最简单的做法是将它们全部提供给您的编译器,例如gfortran file1.for file2.for。 -
在声明返回类型时也不清楚您遇到了什么问题。在这种情况下,您可以扩展您的示例代码吗?
-
这是两个独立的文件。我无法用模块包装程序。我已经尝试在命令行上传递这两个文件。没用。
-
f='Hello Func'不起作用,因为默认返回类型是 REAL。如何设置 CHARACTER? -
凯西的回答能解决你的问题吗?
标签: function linker fortran gfortran