Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: halvorluОтветов: 1

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

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

dependenciesstatic-librarieslinkerfortran

Ответы

Ответ 1 · рейтинг 2 · Peter

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы