Связывание статических библиотек fortran с взаимозависимостями

Я разрабатываю программу 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 могут содержать (и использовать) разные версии одних и тех же объектных файлов?


person halvorlu    schedule 07.02.2014    source источник
comment
не ответ, но зачем prog1 зависеть от другой lib1 версии? Если вы можете обойти это, ваша проблема может не существовать.   -  person steabert    schedule 08.02.2014
comment
В некоторых случаях я могу разрешить lib1 использовать новую версию lib2, но все же разрешить prog1 использовать старую версию, чтобы избежать (или отложить) ее изменение. Но использование той же версии, конечно, было бы самым простым решением.   -  person halvorlu    schedule 09.02.2014


Ответы (1)


Я не думаю, что это возможно сделать с помощью статических библиотек. Это связано с тем, что, исходя из предположения prog1, function1 из модуля lib2 просто определяется 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.

person Peter    schedule 08.02.2014
comment
Спасибо за Ваш ответ. Однако нельзя ли было бы сделать так, чтобы функции lib2 в lib1.a имели, скажем, префикс, отделяющий их от тех, которые prog1 использует непосредственно из lib2? - person halvorlu; 09.02.2014
comment
@halvorlu Я не знаю возможности - person Peter; 09.02.2014