Linker 链接具有相互依赖关系的静态fortran库
我正在开发一个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_
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我不知道任何可能性