Проблема, с которой я столкнулся, решена.Я публикую это, чтобы получить объяснение, почему решение действительно работает.Я получил отличные отзывы здесь раньше.
У меня есть устаревшая кодовая база, в которой используется очень упрощенная система сборки, и мой проект состоит в том, чтобы перенести ее в Autotools для настройки и, в частности, для создания общих библиотек.Основная библиотека написана на C, но она также должна быть связана с Fortran (для унаследованных целей) и распространяется с некоторыми тестовыми кодами в F77.Авторы организовали исходный код в модули ...
src_module1/
src_module2/
...
testc/
testf77/
Они создали библиотеку lib/libmain.a
, скомпилировав код в каталогах src _ * / и заархивировав объекты с помощью ranlib.
MyПервый подход состоял в том, чтобы создать общую библиотеку из каждого src _ * / отдельно и "связать" все это в одну общую библиотеку.При использовании Autotools src_module1/Makefile.am
будет содержать
noinst_LTLIBRARIES = libmodule1.la
libmodule1_la_SOURCES = ...
и т. Д. Для других модулей, и, наконец, lib/Makefile.am
потребуется только:
lib_LTLIBRARIES = libmain.la
libmain_la_SOURCES =
libmain_la_LIBADD = $(top_srcdir)/src_module1/libmodule1.la ...
Это, кажется, работает отлично,Однако, когда код в testc / был скомпилирован и связан с libmain.la, возникла ошибка «символы не найдены».
Думая, что это проблема с libtool или общими библиотеками, я попытался создать только статические, в основном изменив все .la
на .a
и все _LTLIBRARIES
на _LIBRARIES
.Та же проблема.На этот раз, однако, обратите внимание на ошибку «ranlib: warning for library: libmain.a. Содержимое пусто (ни один объектный файл в библиотеке не определяет глобальные символы)» при попытке связать сам libmain.a.
Решение, которое я нашел, похоже на взлом.Я не собирал Makefiles ни для одного из каталогов src _ * /, но вместо этого использовал только для каталога lib /, и его Makefile.am содержал строки:
lib_LTLIBRARIES = libmain.la
libmain_la_SOURCES = [all sources from all ../src_modules/ ]
Это сработало.Скомпилированные программы в testc / связаны с libmain.la без проблем.Одним из «модулей» является набор связываний на Фортране, которые обертывают другие функции C в библиотеке.Даже фортранские коды в testf77 / правильно связаны с libmain.la.
Может кто-нибудь внимательно объяснить, что происходит, когда libtool создает общую библиотеку?Или даже при создании статической библиотеки?Почему несколько статических библиотек нельзя связать вместе, чтобы создать одну статическую библиотеку?Почему символы доступны только тогда, когда libtool / ranlib собирает библиотеку «из исходников»?А как насчет установки разделяемой / статической библиотеки, т.е. перемещения ее в / usr / local / lib --- что там происходит?Статья в Википедии о статических и общих библиотеках для меня недостаточно детальна.
Я ценю все усилия, чтобы разобраться в моем давнем вопросе.