У меня та же проблема, что и у других иметь:
- У меня есть файл
*.la
, сгенерированный libtool в проекте Automake (например,module.la
), - но мне нужны
*.so
этого, чтобы использовать его дляdlopen()
(например,module.so
).
Но: проект настроен и построен с помощью --disable-shared
, чтобы убедиться, что созданный основной двоичный файл является одной большой статически связанной программой, например. main.x
(упрощено развертывание и отладка). При этом файлы *.so
не создаются.
Программа main.x
представляет собой огромное приложение, похожее на фреймворк, способное загружать расширения (модули) через dlopen()
, несмотря на то, что оно связано статически.
Это прекрасно работает, когда я создаю module.so
вручную. Но заставить это работать в Makefile.am
мне кажется невозможным. Да, я могу написать lib_LTLIBRARIES
, но со своим стандартным --disable-shared
у меня не получается файл *.so
.
lib_LTLIBRARIES = module.la
module_so_SOURCES = module.cpp
Создается файл module.la
, который dlopen()
загружаться отказывается (разумеется).
Я попытался поместить правила в Makefile.am
, создав его вручную, и это работает:
# Makefile.am (yes, .am)
all: mm_cpp_logger.so
SUFFIXES = .so
%.so: %.cpp
$(CXX) $(CXXFLAGS) -fPIC -fpic -c -I $(top_srcdir)/include -o $@ $<
%.so: %.o
$(CXX) $(LDFLAGS) -shared -fPIC -fpic -o $@ $<
Но это может быть только обходной путь. Я не получаю всех хороших автоматических функций, таких как проверка зависимостей и установка.
Как я могу построить module.so
, продолжая собирать основную программу с --disable-shared
(или с тем же эффектом) способом Makefile.am
?
- можно ли выполнить постобработку
*.la
файлов в*.so
файлов с помощью специального правила автосоздания? - Могу ли я настроить процесс
lib_LTLIBRARIES
для создания файлов*.so
в любом случае?