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

Linker 链接具有相互依赖关系的静态fortran库,linker,dependencies,fortran,static-libraries,Linker,Dependencies,Fortran,Static Libraries,我正在开发一个Fortran程序prog1和两个Fortran库lib1和lib2prog1依赖于lib1和lib2,lib1也依赖于lib2。目录结构可能如下所示: prog1 |- lib2 |- lib1 |- lib2 在某些情况下,我希望prog1使用与lib1不同的lib2版本。但是,如果静态库lib1.a包含lib2中的对象文件,则链接器会给出如下错误 ./lib1/lib1.a(lib2_module.o): In function `__lib2_module_MOD_

我正在开发一个Fortran程序
prog1
和两个Fortran库
lib1
lib2
prog1
依赖于
lib1
lib2
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的角度来看,lib2模块中的function1被简单定义了2次。

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

您可能不会感到惊讶,因为此代码会生成您在问题中看到的类似错误:

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编译为共享库,并确保(编译器/平台相关)lib2中的符号不会从共享lib1导出。

不是答案,但为什么
prog1
需要依赖于不同的
lib1
版本?如果你能解决这个问题,你的问题可能就不存在了。在某些情况下,我可能想让
lib1
使用
lib2
的新版本,但仍然让
prog1
使用旧版本,以避免(或推迟)更改它。但是使用相同的版本当然是最简单的解决方案。谢谢你的回答。然而,在
lib1.a
中是否有可能使
lib2
的函数具有前缀,例如,将它们与
prog1
直接从
lib2
使用的函数分开?@halvorlu我不知道任何可能性