【问题标题】:Compile different files where functions and common blocks have the same name编译函数和公共块具有相同名称的不同文件
【发布时间】:2021-07-22 12:08:15
【问题描述】:

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


【解决方案1】:

我发现的一个(有点 hacky)解决方案是使用标志 -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_

【讨论】:

  • 这真的很脏。帮自己和你的代码库一个忙,重命名一些标识符,这样命名空间就不会发生冲突。无论如何,您都需要使用您提出的这个选项进行代码调整,为什么不正确地做呢?
  • 我首选的解决方案是将全局变量放在模块中,每个组件中具有不同的模块名称。您可以在自己的代码中执行此操作,然后可以不理会其他代码库。像@VladimirF 一样,我相信您正在使用编译切换方法为未来的问题做好准备。
  • @VladimirF 问题是我不知道哪些函数需要重命名。我想保留程序 A 的代码,因为它只是即插即用,因为它是外部软件,我不想在每次更新时潜在地重写代码。我希望有一些编译器标志会自动更改子例程的名称(例如省略尾随下划线),以便来自不同代码的具有相同名称的子例程不会发生冲突。
  • @SteveLionel 澄清一下,我在自己的代码中没有使用任何(相关)全局变量,问题是程序 A 和程序 B 之间的 COMMON 块和子程序名称冲突。我只能访问程序 A 的源代码,因为程序 B 部分是预编译的,程序 A 的源代码非常冗长和复杂。
  • 您不想重命名函数,除非它们也发生冲突。你想重命名公共块。或者实际上,将变量放入模块中。顺便说一句,公共块只不过是共享全局变量的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多