Участник:Petr-akhlamov/lafiles вразработке

Материал из ALT Linux Wiki

Если сборка требует la файл

Что такое .la-файл?

Файл .la (Libtool archive) содержит метаинформацию для libtool о статической или динамической библиотеке. Файлы .la (libtool archive) активно использовались примерно с 1990-х годов по 2010-е в проектах, использующих GNU Libtool для управления созданием и связыванием динамических и статических библиотек. Однако к концу 2010-х годов их использование стало менее распространённым по нескольким причинам:

  • Они хранят жесткие пути к зависимостям, что мешает перемещению библиотек.
  • Усложняют систему, особенно при кросс-компиляции.
  • .la файлы не нужны, если используются pkg-config и SONAME.

Пример использования .la в проекте

Например, при сборке, hasher ругается на файл:

/usr/bin/c++ -fPIC -pipe -frecord-gcc-switches -Wall -g -O2 -flto=auto -fdebug-prefix-map=/usr/src/RPM/BUILD/tde-tdelibs/tde-tdelibs=. -fmacro-prefix-map=/usr/src/RPM/BUILD/tde-tdelibs/tde-tdelibs=. -fvisibility=hidden -fvisibility-inlines-hidden  -DTQT_NO_ASCII_CAST -DTQT_NO_STL -DTQT_NO_COMPAT -DTQT_NO_TRANSLATION -DTQT_THREAD_SUPPORT -D_REENTRANT -include tqt.h -I/usr/include/tqt3 -I/usr/include/tqt -DTQT_NO_ASCII_CAST -DTQT_NO_STL -DTQT_NO_COMPAT -DTQT_NO_TRANSLATION -DTQT_THREAD_SUPPORT -D_REENTRANT -include tqt.h -DNDEBUG -Wl,--dependency-file=CMakeFiles/tdecore-shared.dir/link.d -Wl,--as-needed -Wl,--no-undefined -Wl,-z,now -Wl,--no-undefined -shared -Wl,-soname,libtdecore.so.14 -o libtdecore.so.14.1.0 "CMakeFiles/tdecore-shared.dir/libintl.cpp.o" <...> "CMakeFiles/tdecore-shared.dir/kpixmapprovider.cpp.o" "CMakeFiles/tdecore-shared.dir/kurldrld: cannot find -lltdlc: No such file or directory
collect2: error: ld returned 1 exit status

Ошибка:

cannot find -lltdlc: No such file or directory

С помощью Grep узнаем, где эта библиотека прописана:

grep -nrF "libltdlc.la" '/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs'
/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdecore/CMakeLists.txt:145:  LINK_PRIVATE ltdlc-static ${KDESVGICONS} ${XCOMPOSITE_LIBRARIES}
/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdecore/Makefile.am:125:libtdecore_la_LIBADD = malloc/libklmalloc.la network/libtdecorenetwork.la $(SVGICON_LIB) ../dcop/libDCOP.la ../libltdl/libltdlc.la \
/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdeio/CMakeLists.txt:95:  LINK_PRIVATE ltdlc-static tdesu-shared ${LIBR_LIBRARIES} ${ACL_LIBRARIES}
/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdeinit/CMakeLists.txt:43:  LINK kICE-static ltdlc-static tdeparts-shared ${FONTCONFIG_LIBRARIES} ${XFT_LIBRARIES}
/home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdeinit/CMakeLists.txt:104:  LINK ltdlc-static tdeio-shared

Это файл /home/user/_MYPROJECTS/TDE-github/10-tdelibs/10-tdelibs/tde-tdelibs/tdecore/Makefile.am:125

В нем есть эта строка:

libtdecore_la_LIBADD = malloc/libklmalloc.la network/libtdecorenetwork.la $(SVGICON_LIB) ../dcop/libDCOP.la ../libltdl/libltdlc.la

Из-за которой, кроме прочих, возникает ошибка.

Как сделать правильно?

Лучше использовать pkg-config в файле configure.ac и передавать переменные в Makefile.am.

1. В configure.ac (или configure.in) добавьте:

PKG_CHECK_MODULES([LTDL], [libltdl])
AC_SUBST([LTDL_CFLAGS])
AC_SUBST([LTDL_LIBS])

2. В Makefile.am замените строку:

libtdecore_la_LIBADD = malloc/libklmalloc.la network/libtdecorenetwork.la $(SVGICON_LIB) ../dcop/libDCOP.la $(LTDL_LIBS)

3. Пересоберите проект в hasher

Почему это лучше?

✅ pkg-config проверяется на этапе configure, а не в момент сборки
✅ Избегается проблема с $(shell ...) в automake
✅ Работает кросс-платформенно