私が抱えていた問題は解決されました。ソリューションが実際に機能する理由についての説明を求めるために、これを投稿しています。私は以前ここで素晴らしいフィードバックを得ました。
私は非常に単純なビルドシステムを使用したレガシーコードベースを持っています。私のプロジェクトは、カスタマイズ、特に共有ライブラリのビルドのためにそれをAutotoolsに移行することです。メインライブラリはCで記述されていますが、Fortranからリンク可能である必要があり(レガシー目的)、F77でいくつかのテストコードとともに配布されます。著者はソースコードをモジュールに編成しました...
src_module1/
src_module2/
...
testc/
testf77/
彼らlib/libmain.a
は、src _ * /ディレクトリにコードをコンパイルし、ranlibを使用してオブジェクトをアーカイブすることにより、ライブラリを構築しました。
私の最初のアプローチは、各src _ * /から個別に共有ライブラリを構築し、これらすべてを1つの共有ライブラリに「リンク」することでした。Autotoolsを使用するsrc_module1/Makefile.am
と、
noinst_LTLIBRARIES = libmodule1.la
libmodule1_la_SOURCES = ...
他のモジュールについても同様で、最後にlib/Makefile.am
必要なのは次のとおりです。
lib_LTLIBRARIES = libmain.la
libmain_la_SOURCES =
libmain_la_LIBADD = $(top_srcdir)/src_module1/libmodule1.la ...
これは完全に機能しているように見えました。ただし、testc /のコードがコンパイルされ、libmain.laに対してリンクされると、「シンボルが見つかりません」というエラーが発行されました。
これはlibtoolまたは共有ライブラリの問題だと考えて、静的のみをビルドし、基本的にすべてをに変更して.la
みました。同じ問題。ただし、今回は、libmain.a自体をリンクしようとすると、「ranlib:ライブラリの警告:libmain.a目次が空です(ライブラリ内のオブジェクトファイルメンバーがグローバルシンボルを定義していません)」というエラーに注意してください。.a
_LTLIBRARIES
_LIBRARIES
私が見つけた解決策はハックのようです。src _ * /ディレクトリのいずれにもMakefileを作成しませんでしたが、代わりにlib /ディレクトリにのみ使用し、そのMakefile.amには次の行がありました。
lib_LTLIBRARIES = libmain.la
libmain_la_SOURCES = [all sources from all ../src_modules/ ]
これはうまくいきました。testc /でコンパイルされたプログラムは、問題なくlibmain.laに対してリンクされています。「モジュール」の1つは、ライブラリ内の他のC関数をラップするFortranバインディングのセットです。testf77 /のFortranコードでさえ、libmain.laに対して適切にリンクされています。
libtoolが共有ライブラリを構築するとどうなるかを誰かが注意深く説明できますか?または、静的ライブラリを構築する場合でも?複数の静的ライブラリをリンクして1つの静的ライブラリを作成できないのはなぜですか?libtool / ranlibが「ソースから」ライブラリをビルドする場合にのみシンボルが使用できるのはなぜですか?そして、共有/静的ライブラリをインストールする、つまり/ usr / local / libに移動するのはどうですか?---そこで何が起こりますか?静的ライブラリと共有ライブラリに関するウィキペディアの記事は、私にとって十分に詳細ではありません。
私の長年の質問を理解するためのあらゆる努力に感謝します。