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.