Участник:Petr-akhlamov/lafiles вразработке
Если сборка требует 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
✅ Работает кросс-платформенно