首页 > 解决方案 > 编译函数和公共块同名的不同文件

问题描述

我目前正在尝试在另一个第 3 方程序(程序 B)中实现一些第 3 方代码(程序 A)。不幸的是,似乎某些COMMON块和子程序在两个代码之间共享名称。编译器没有检测到这一点(我怀疑是因为编译过程涉及许多不同的文件并创建共享对象),但是当访问具有非常通用名称(例如BASISJACOBIAN)的某些公共块/子例程时程序崩溃,并且重命名它们可以缓解问题。但是,重命名程序 A 中的所有公共块和子程序是不可行的,因为它的大小。

目前,我有两个单独的代码目录。我用英特尔编译器将两者分别编译成.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,我无法更改。

标签: fortrannamespacesshared-librariesintel-fortran

解决方案


我发现的一个(有点老套)解决方案是codeA.f使用 flag进行编译,并使用尾随下划线-assume nounderscore重命名需要手动调用的函数:code_coupling.F90

ifort -c -fPIC -fp-model precise -assume nounderscore 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

codeA_subroutine将其中的子例程重命名codeA.fcodeA_subroutine_


推荐阅读