【问题标题】:Linking static fortran libraries with inter-dependencies链接具有相互依赖关系的静态 fortran 库
【发布时间】:2014-02-07 17:39:36
【问题描述】:

我正在开发一个 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 版本?如果你能解决这个问题,你的问题可能就不存在了。
  • 在某些情况下,我可能想让lib1 使用lib2 的新版本,但仍然让prog1 使用旧版本,以避免(或推迟)更改它。但是使用相同的版本当然是最简单的解决方案。

标签: linker dependencies fortran static-libraries


【解决方案1】:

我认为使用静态库不可能做到这一点。这是因为从 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 的符号不会从共享 lib1 中导出。

【讨论】:

  • 感谢您的回答。但是,难道不能让lib2lib1.a 中的函数有一个前缀,将它们与prog1 直接从lib2 使用的函数分开吗?
  • @halvorlu 我不知道有什么可能
猜你喜欢
  • 2011-06-06
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多