我正在开发Fortran程序prog1
和两个Fortran库lib1
和lib2
。 prog1
取决于lib1
和lib2
,lib1
也取决于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库如何包含(并使用)相同目标文件的不同版本?
答案 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中的符号不从共享库中导出。