una que predefinidas matematicas librerias libreria funciones estatica dinamicas dinamica crear creacion compilar linker dependencies fortran static-libraries

linker - que - libreria math.h c++



Vinculación de bibliotecas estáticas fortran con interdependencias (1)

Estoy desarrollando un programa Fortran prog1 y dos bibliotecas Fortran, lib1 y lib2 . prog1 depende de lib1 y lib2 , y lib1 también depende de lib2 . La estructura del directorio podría verse así:

prog1 |- lib2 |- lib1 |- lib2

En algunos casos, me gustaría que prog1 use una versión diferente de lib2 que la que usa lib1 . Sin embargo, si la biblioteca estática lib1.a incluye los archivos objeto de lib2 , el enlazador me da errores como

./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

En otras palabras, el enlazador está confundido ya que ambas bibliotecas contienen el mismo archivo de objeto lib2_module.o , pero con diferentes versiones.

Entonces mi pregunta es: ¿cómo pueden dos bibliotecas Fortran contener (y usar) diferentes versiones de los mismos archivos objeto?


No creo que sea posible hacerlo mediante el uso de bibliotecas estáticas. Se debe a que desde la perspectiva prog1, la función 1 del módulo de lib2 es simple, definida 2 veces. En Wikipedia puedes ver eso

... funciones externas y variables que se resuelven en un llamante en tiempo de compilación y se copian en una aplicación de destino ...

Y probablemente no te sorprenda que este código genere errores similares a los que ves en tu pregunta:

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...

Una posibilidad sería compilar al menos lib1 como biblioteca compartida y asegurarse (dependiente del compilador / plataforma) de que los símbolos de lib2 no se exporten desde lib1 compartido.