编译函数和公共块具有相同名称的不同文件 [英] Compile different files where functions and common blocks have the same name
本文介绍了编译函数和公共块具有相同名称的不同文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
COMMON
块和子例程在两个代码之间共享名称。编译器没有检测到这一点(我怀疑这是因为编译过程涉及许多不同的文件并创建一个共享对象),但是当使用非常通用的名称(例如BASIS
、JACOBIAN
)访问某些公共块/子例程时,程序会崩溃,重命名它们可以缓解问题。但是,由于程序A的大小,重命名程序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
内调用,我无法更改。
- 是否可以使用一些其他编译器标志编译
codeA.f
,以便COMMON
块和子例程的名称不会相互干扰? - 是否有其他方法可以防止名称相互干扰?
推荐答案
我发现的一个(有点老套的)解决方案是使用标志-assume nounderscore
编译codeA.f
,并在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.f
内的子例程codeA_subroutine
重命名为codeA_subroutine_
。
这篇关于编译函数和公共块具有相同名称的不同文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文