链接具有相互依赖关系的静态Fortran库

5

我正在开发一个Fortran程序prog1和两个Fortran库,lib1lib2prog1依赖于lib1lib2,而lib1也依赖于lib2。 目录结构可能如下所示:

prog1
|- lib2
|- lib1
   |- lib2

在某些情况下,我希望prog1使用与lib1不同的lib2版本。然而,如果静态库lib1.a包含来自lib2的目标文件,链接器会给出如下错误:
./lib1/lib1.a(lib2_module.o): In function `__lib2_module_MOD_function1':
./lib2/src/lib2_module.f90:12: multiple definition of `__lib2_module_MOD_function1'
./lib2/lib2.a(lib2_module.o):./lib2/src/lib2_module.f90:12: first defined here

换句话说,链接器感到困惑,因为两个库都包含相同的目标文件lib2_module.o,但版本不同。
所以我的问题是:两个Fortran库如何包含(并使用)相同目标文件的不同版本?

不过,为什么prog1需要依赖于不同的lib1版本呢?如果您可以解决这个问题,那么您的问题可能就不存在了。 - steabert
在某些情况下,我可能希望让lib1使用新版本的lib2,但仍然让prog1使用旧版本,以避免(或推迟)更改。但是,使用相同的版本当然是最简单的解决方案。 - halvorlu
1个回答

2
我认为使用静态库不可能实现这个。因为从 prog1 的角度来看,lib2 模块的 function1 被定义了两次。 您可以在维基百科上看到

...在调用者在编译时解析并复制到目标应用程序中的外部函数和变量...

你可能不会惊讶,这段代码将生成类似于你在问题中看到的错误:

prog1.f90

some code here... 

function funtion1(x) ...
  ...first version of function1 ...
end function

function funtion1(x) ...
  ...second version of function1 ...
end function

some code here...

一种可能性是将至少lib1编译为共享库,并确保(取决于编译器/平台)从共享库lib1不导出来自lib2的符号。

谢谢您的回答。不过,是否有可能让lib1.alib2的函数具有前缀,以将它们与prog1直接从lib2使用的函数区分开来? - halvorlu
@halvorlu 我不知道任何可能性。 - Peter Petrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接