将静态fortran库与相互依赖关系链接起来

时间:2014-02-07 17:39:36

标签: linker dependencies fortran static-libraries

我正在开发Fortran程序prog1和两个Fortran库lib1lib2prog1取决于lib1lib2lib1也取决于lib2。目录结构可能如下所示:

prog1
|- lib2
|- lib1
   |- lib2

在某些情况下,我希望prog1使用lib2的不同版本而不是lib1使用的版本。但是,如果静态库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库如何包含(并使用)相同目标文件的不同版本?

1 个答案:

答案 0 :(得分:2)

我不认为可以通过使用静态库来实现它。这是因为从prog1开始,lib2模块的function1被简单定义了2次。 On Wikipedia you can see that

  

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

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

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中的符号不​​从共享库中导出。