【发布时间】:2021-07-22 12:08:15
【问题描述】:
我目前正在尝试在另一个第 3 方程序(程序 B)中实现一些第 3 方代码(程序 A)。不幸的是,似乎一些COMMON 块和子例程在两个代码之间共享名称。编译器没有检测到这一点(我怀疑是因为编译过程涉及许多不同的文件并创建共享对象),但是当访问具有非常通用名称的某些公共块/子例程时程序崩溃(例如BASIS、JACOBIAN) ,重命名它们可以缓解问题。但是,重命名程序 A 中的所有公共块和子程序是不可行的,因为它的大小。
目前,我有两个单独的代码目录。我使用 intel 编译器将两者分别编译成 .o 文件,然后从两者创建一个共享对象:
ifort -c -fPIC -fp-model precise codeA.f
ifort -c -fPIC -fp-model precise codeB.f
ifort -c -fPIC -fp-model precise code_coupling.F90
ld -shared -o library.so codeA.o codeB.o code_coupling.o
code_coupling.F90 中的代码用于耦合两个代码,它在codeB.f 中调用,我无法更改。
- 是否有可能使用一些额外的编译器标志来编译
codeA.f,以便COMMON块和子例程的名称不会相互干扰? - 还有其他方法可以防止名称相互干扰吗?
【问题讨论】:
-
COMMON 共享一个名称并不是编译器应该检测到的错误,因为这是该语言的基本特征。可以检测到的是命名 COMMON 的大小不同,但这要到链接时间才能看到,并且链接器通常不关心这一点。 Digital/Compaq Visual Fortran 有一个可选工具,它可以在链接器之前运行,它会接受这个,但我还没有在其他地方看到它。
-
将你的通用声明放在一个文件中并包含该文件以声明通用块。
标签: fortran namespaces shared-libraries intel-fortran