我目前正在尝试在另一个 3rd 方程序(程序 B)中实现一些 3rd 方代码(程序 A)。不幸的是,似乎有些COMMON
块和子程序在两个代码之间共享名称。这不会被编译器检测到(我怀疑是因为编译过程涉及许多不同的文件并创建了一个共享对象),但是在访问某些具有非常通用名称的公共(public)块/子例程(例如 BASIS
、 JACOBIAN
)时程序会崩溃,重命名它们可以缓解这个问题。但是,由于程序 A 的大小,重命名程序 A 中的所有公共(public)块和子程序是不可行的。
目前,我有两个单独的代码目录。我用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
的名称块和子程序不会相互干扰? 最佳答案
我发现的一个(有点hacky)解决方案是编译codeA.f
带旗-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.f
至 codeA_subroutine_
.
关于fortran - 编译不同的文件,其中函数和公共(public) block 具有相同的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68484571/