2011-08-18 11 views
14

.laと.aライブラリのないautotools/libtoolを使って.soモジュールをビルドしてインストールする方法--prefix pathにもインストールされていますか?.laと.aの亜種がインストールされていないautotools/libtoolを持つ.soモジュール

現在、私は、次のMakefile.amを使用しています:

lib_LTLIBRARIES = libCurlDownloader.la 
libCurlDownloader_la_SOURCES = Curl.cpp 
libCurlDownloader_la_LDFLAGS = -module -avoid-version 

それは動作しますが、libCurlDownloader.soに加えて、それはまた、望ましくないものを、libCurlDownloader.laとlibCurlDownloader.aをインストールします。

アップデート#1

.Aはconfigure.ac

のいずれかで

./configure --disable-static 

または

AC_ENABLE_SHARED(yes) 
AC_ENABLE_STATIC(no) 

を使用することによって、生成されないことが可能ですしかし、それはまだ.laをbにする方法の問題です.soがインストールされている間、インストールにインストールされたeing --prefix

アップデート#2

あなたが必ずしも.laファイルを削除するべきではありません

install-exec-hook: find $(DESTDIR)$(libdir) -type f -name \*.la -delete 
+0

あなたはマイナーなタイプミス(install-exec-hookでなければなりません)があります。 – Compholio

+0

私はあなたができないと思います。debianパッケージャはdebパッケージの手作業でlaファイルを取り除きます。 – sherpya

+0

'install-exec-hook'は悪い考えのようです。プロジェクトによって生成されたものだけでなく、ディレクトリからすべての.laファイルを削除します。 'DESTDIR'が使用されていればそれほど問題はありませんが、それ以外の場合は非常に間違っています。 – Maarten

答えて

1

を使用して--prefixインストールから.laファイルを削除することが可能です。 .laファイルには、2つの状況で使用される情報が含まれています。

  1. ビルドされたライブラリに対して静的にリンクしています。静的にリンクすると(つまり、.a-static)、リンクされているライブラリの依存関係に関する情報はないので、libtoolは.laファイルの情報を使用して、必要なすべての依存関係を参照する適切なldコマンドを作成できます。 MinGWのような環境では、リンカーが再帰的な依存関係を解決するために特定の順序で同じライブラリを指定する必要がある環境では、これはしばしば重要です。これは静的なバイナリを構築しようとする場合にのみ問題になります。動的に(すなわち、libltdlを使用している場合lt_dlopen付き)一部プラットフォーム上でビルドライブラリをロード

  2. 。同様に、特定のプラットフォームでは、コンパイルモジュールの依存関係がバイナリにエンコードされないため、lt_dlopenが正しい依存関係を見つけてロードするように、ファイル.laが必要です。 ELFプラットフォーム(Linuxを含む)およびPEプラットフォーム(Windows)では、依存関係はライブラリに格納されるため、.laファイルなしでlt_dlopenが動作します。 MacOSのMachOフォーマットでは、バンドルをビルドするときにファイルを.laにする必要があります。

のDebian/Ubuntuのパッケージャは、第二の理由は、Linux上で適切ではありませんので、そのパッケージから.laファイルを除外することを決定したと、彼らはあなたが最初の場所で静的なバイナリをビルドしませんでした好むだろう。 libtoolがサポートするように設計された他のプラットフォームでは、プログラムをリンクまたは実行するためにファイルが必要になることがあります(.la)。

+2

スタティックリンク依存関係の場合。ほとんどの場合(既存の.laファイルでも) 'pkg-config'命令が利用可能です。 –

+3

同様 - 動的リンクの場合でも、 'pkg-config'はlibtoolの松葉杖より良い助けとなります。ビルドシステムに依存しない方法で。 –

2

私はautomake/libtoolでプラグインの言葉である "module"という用語を使用していたので、この質問に遭遇しました。私はFinitにプラグインシステムを持っているので、プラグインを '-module'でビルドして、.aファイルを作成しないようにします。しかし、私はまだ.laファイルがインストールされていますが、実際には '-module'の場合には適用されません。

私はプラグインのファイルを.laスキップする文書化の方法を見つけるために、まだましたが、ここで私はそれを行う方法です。

AM_LDFLAGS = -module -avoid-version -shared 
pkglib_LTLIBRARIES = alsa-utils.la bootmisc.la 

install-exec-hook: 
     @(cd $(DESTDIR)$(pkglibdir) && $(RM) $(pkglib_LTLIBRARIES)) 

明確にするために、私のユースケースには誰もにそこに行くされていません私のプラグインとの "リンク"は.soなので、.laファイルは本当に役に立たない。

+0

見つかりましたか?私は本当にこれが嫌いです。 –

+0

@iharob nope、そのフックルールを使用して.laファイルをクリーンアップします。詳細はこちらのプロジェクトはこちら(こちら)です(https://github.com/troglobit/finit)。 – troglobit

関連する問題