У меня та же проблема, что и другие:
- У меня есть
*.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 [email protected] $<
%.so: %.o
$(CXX) $(LDFLAGS) -shared -fPIC -fpic -o [email protected] $<
Но это может быть только обходным путем. Я не получаю все хорошие автоматические функции, такие как проверка зависимостей и установка.
Как я могу построить module.so
, все еще создавая основную программу с помощью --disable-shared
(или с тем же эффектом) в Makefile.am
-way?
- Могу ли я постовать файлы
*.la
в файлы*.so
со специальным правилом automake? - Могу ли я настроить процесс
lib_LTLIBRARIES
для создания файлов*.so
в любом случае?