1

Autotools: A Practioner 's Guide to GNU Autoconf, Automake, and Libtoolの第 6 章 (libtool を使用したライブラリの構築) では、ライブラリのリンクの例が示されています。

この例では、ライブラリlibjupiter.soが別のライブラリにリンクされていますlibjupcommon.alibjupiter.soPIC が必要なため、最初の試行は失敗しますが、そうでlibjupcommon.aはありません。libjupcommon_a_CFLAGS = -fPIC著者はそれを修正するために追加します。ずっと良くなりますが、「共有ライブラリ libjupiter.la をスタティック ライブラリ ../common/libjupcommon.a に対してリンクすると、移植性がありません! 」という警告が表示されます。」が表示されます。

したがって、作成者は、libtool を使用して をビルドし、Makefile.am を再度変更しlibjupcommon.laます。へのlibjupiterリンクlibjupcommon.la。このような:

noinst_LTLIBRARIES = libjupcommon.la

libjupcommon_la_SOURCES = jupcommon.h print.c

...

libjupiter_la_LIBADD = ../common/libjupcommon.la

今回はすべてOKです。


今、私の問題:

libjupiterneedsと同じように、別のライブラリが必要なライブラリがありますlibjupcommon。違いは、私libjupcommonが別のプロジェクトからのもので、システムにインストールされていることです。ではありませんnoinst_LTLIBRARIES.so.aバージョンの両方が存在します。libjupcommon.la例のように をリンクしようとすると、.soが選択されますが、動的なリンク関係は必要ありません。本の例のように、にリンクしたい.a

.a明示的に (_LIBADD=the .a ファイルを使用して) にリンクすると、使用可能なライブラリが得られますが、「... ポータブルではありません」という警告が表示されます。

.aこの場合、へのリンクを達成する適切な方法は何ですか?

PS:書籍の公式サイトからサンプルをダウンロードしてください。でautotools/book/jupiter-libtool-ch6/common、Makefile.am を変更して、私の問題によく似たものにする必要がありますnoinst_LTLIBRARIESlib_LTLIBRARIES

4

2 に答える 2

2

試すことができることがいくつかあります。共有ライブラリのコンパイルをオフにする(そして静的ライブラリを再度追加する)オプションを指定して実行configureしてみることができます。を追加してlibtoolを取得し、静的にビルドしてみてください(ここでも静的libをに追加します)。--disable-sharedlibfoo_LIBADD-staticlibfoo_LDFLAGSlibfoo_LIBADD

編集:静的ライブラリと共有ライブラリの両方が必要なため、上記は機能しません。

追加してみてください:

AC_CHECK_LIB([abc],[some_function_in_libabc])

configure.acに。

于 2011-11-08T05:28:05.217 に答える