12

libtoolを使用して libfoo.a と libfoo.so の 2 つのオブジェクトにコンパイルされたライブラリ ( libfoo ) があります。

libtoolも使用して、すべての libfoo のコードを含む単一の共有ライブラリ (libbar.so) になる別のライブラリ ( libbar ) を作成する必要があります。

これを行うには、libbar が libfoo.so ではなく libfoo.aリンクするように強制する必要があります。

私はautotools環境にいるので、標準のconfigure.inまたはMakefile.amルールを使用してこれを解決する必要があります。

configure.in のように、いくつかのことを試しました:

LDFLAGS="$LDFLAGS "-Wl,-Bstatic -lfoo -Wl,-Bdynamic"

これにより、常にリンク行に -Wl フラグが付きます。しかし -lfoo は消えて、先頭に絶対パス形式 ( /opt/foo/lib/libfoo.so ) で配置されています。

私も試しました:

LDFLAGS="$LDFLAGS "-L/opt/foo/lib libfoo.a"

または Makefile.am で:

libbar_la_LDADD = -Wl,-Bstatic -lfoo -Wl,-Bdynamic

libbar_la_LTLIBRARIES = libfoo.a

etc etc (非常に多くのバリエーションがあります!)

しかし、これを単独で解決するには、Autotools/Libtool について十分な知識がないことは間違いないと思います。私はそれについてネット上で情報を見つけることができませんでした.常にわずかに異なる問題です.

4

2 に答える 2

7

おそらく便利なライブラリを使用できます。コンビニエンス ライブラリは、インストールされていない中間の静的ライブラリです。プレフィックスnoinstを使用して作成できます。

noinst_LTLIBRARIES = libfoo_impl.la

lib_LTLIBRARIES = libfoo.la libbar.la
libfoo_la_LIBADD = libfoo_impl.la
libbar_la_LIBADD = libfoo_impl.la
于 2012-12-20T19:09:44.380 に答える
4

標準的な方法は、 でビルドすることlibfooです--disable-shared。静的にリンクするか動的にリンクするかはユーザーが決定することなので、パッケージのメンテナーとしてそれを強制する方法は実際にはありませんが、が存在libbarする場合は構成を失敗するように設定できますlibfoo.so(クリーンな方法はわかりません)。実際にはユーザーの選択なので、それは悪い考えだと思います。) 最善の策は、ユーザーに を使用してビルドさせることだと思いますが、libfoo/ でのみ静的ライブラリを指定することlibfoo--disable-shared、その選択を強制できます。 configure.ac:

LT_INIT([disable-shared])

libfooその場合、共有ライブラリとしてビルドできなくなりますので注意してください。おそらくそれがあなたが望むものです。

于 2012-06-01T14:48:07.177 に答える