编译函数和公共块具有相同名称的不同文件
Compile different files where functions and common blocks have the same name
我目前正在尝试在另一个第 3 方程序(程序 B)中实施一些第 3 方代码(程序 A)。不幸的是,似乎有些 COMMON
块和子例程在两个代码之间共享名称。编译器没有检测到这一点(我怀疑是因为编译过程涉及许多不同的文件并创建一个共享对象),但是当访问某些具有非常通用名称的公共块/子例程时程序崩溃(例如 BASIS
、JACOBIAN
),重命名它们可以缓解这个问题。但是,重命名程序 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_
。
我目前正在尝试在另一个第 3 方程序(程序 B)中实施一些第 3 方代码(程序 A)。不幸的是,似乎有些 COMMON
块和子例程在两个代码之间共享名称。编译器没有检测到这一点(我怀疑是因为编译过程涉及许多不同的文件并创建一个共享对象),但是当访问某些具有非常通用名称的公共块/子例程时程序崩溃(例如 BASIS
、JACOBIAN
),重命名它们可以缓解这个问题。但是,重命名程序 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_
。