私は他の人が持っているのと同じ問題を抱えています:
- Automakeプロジェクトでlibtoolによって生成された
*.la
ファイルがあります (例: )。module.la
- しかし、それを使用するにはが必要
*.so
dlopen()
です(例:module.so
)。
--disable-shared
ただし、プロジェクトは、作成されたメインバイナリが静的にリンクされた1つの大きなプログラムであることを確認するために構成およびビルドされます。たとえば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
- 特別な automake ルールを使用して、
*.la
ファイルをファイルに後処理できますか?*.so
- いずれにせよ、ファイル
lib_LTLIBRARIES
を作成するプロセスを微調整できますか?*.so