2009-07-22 6 views
14

私はいくつかのテストとインストールされていないプログラムを持っているライブラリlibgdataを作成しています。私は一度ライブラリーをインストールしてしまえば、プログラムはインストールされているバージョンにリンクされているように見えますが、ローカルバージョンではなく、../src/libgdata.laにリンクしているようです。なぜautoconf/automakeプロジェクトは、ローカル開発ライブラリの代わりにインストールされたライブラリとリンクしますか?

この原因は何ですか?恐ろしいことをしていますか?私がテストを実行する場合、例えば、そう

libapiutilはlibcurlのとのlibxml ++に対処するためのいくつかのヘルパーのものを持っている別のライブラリである)

INCLUDES = -I$(top_srcdir)/src/ -I$(top_srcdir)/test/ 

# libapiutil contains all of our dependencies! 
AM_CXXFLAGS = $(APIUTIL_CFLAGS) 
AM_LDFLAGS = $(APIUTIL_LIBS) 

LDADD = $(top_builddir)/src/libgdata.la 

noinst_PROGRAMS = gdatacalendar gdatayoutube 

gdatacalendar_SOURCES = gdatacalendar.cc 

gdatayoutube_SOURCES = gdatayoutube.cc 

TESTS = check_bare 

check_PROGRAMS = $(TESTS) 

check_bare_SOURCES = check_bare.cc 

:ここ

は私test/Makefile.amは、次のようになります何もインストールせずに、すべて正常に動作します。私はローカルで変更を加えることができ、すぐにこれらのプログラムによって取得されます。

パッケージをインストールした場合、これらのプログラムはコンパイルされます(実際にはヘッダーがローカルにあるようです)が、プログラムを実行するとシンボルの欠落があると文句を言います。

私の知る限り、これはmake出力に基づいて新しくビルドされたライブラリ(../src/libgdata.la)とリンクしているので、なぜこれが起こっているのか分かりません。私がインストールされたファイルを削除した場合、src/*へのローカル変更はうまくいきます。

以下にgdatacalendarのmake出力を含めました。

g++ -DHAVE_CONFIG_H -I. -I.. -I../src/ -I../test/ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -MT gdatacalendar.o -MD -MP -MF .deps/gdatacalendar.Tpo -c -o gdatacalendar.o gdatacalendar.cc 
mv -f .deps/gdatacalendar.Tpo .deps/gdatacalendar.Po 
/bin/bash ../libtool --tag=CXX --mode=link g++ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -L/home/altern8/workspaces/4355/dev-install/lib -lapiutil -lcurl -lgssapi_krb5 -lxml++-2.6 -lxml2 -lglibmm-2.4 -lgobject-2.0 -lsigc-2.0 -lglib-2.0 -o gdatacalendar gdatacalendar.o ../src/libgdata.la 
mkdir .libs 
g++ -I/home/altern8/workspaces/4355/dev-install/include -I/usr/include/libxml++-2.6 -I/usr/lib/libxml++-2.6/include -I/usr/include/libxml2 -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -o .libs/gdatacalendar gdatacalendar.o -L/home/altern8/workspaces/4355/dev-install/lib /home/altern8/workspaces/4355/dev-install/lib/libapiutil.so /usr/lib/libcurl.so -lgssapi_krb5 /usr/lib/libxml++-2.6.so /usr/lib/libxml2.so /usr/lib/libglibmm-2.4.so /usr/lib/libgobject-2.0.so /usr/lib/libsigc-2.0.so /usr/lib/libglib-2.0.so ../src/.libs/libgdata.so -Wl,--rpath -Wl,/home/altern8/workspaces/4355/dev-install/lib 
creating gdatacalendar 

ヘルプ。 :)

UPDATE

私はaddCommonRequestHeader()方法なしでライブラリをインストールした後、私はサービスクラスにaddCommonRequestHeader()メソッドを追加したカレンダープログラムを実行しようとすると、私は次のメッセージを取得します。

/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: 
symbol lookup error: 
/home/altern8/workspaces/4355/libgdata/test/.libs/lt-gdatacalendar: 
undefined symbol: 
_ZN55gdata7service7Service22addCommonRequestHeaderERKSsS4_ 

助けなかった$LD_LIBRARY_PATH変数を設定しようとするユージンの提案。

UPDATE 2

私は2つのテストをしました。まず、私はdev-installディレクトリ(--prefix)を吹き飛ばした後にこれを行い、その場合はtest/.libs/lt-gdatacalendarを作成します。しかし、ライブラリをインストールすると、代わりにtest/.libs/gdatacalendarが作成されます。 LDDの出力は、1つの例外を除いて、両方で同じです:

# before install 
# ldd test/.libs/lt-gdatacalendar 
libgdata.so.0 => /home/altern8/workspaces/4355/libgdata/src/.libs/libgdata.so.0 (0xb7c32000) 

# after install 
# ldd test/.libs/gdatacalendar 
libgdata.so.0 => /home/altern8/workspaces/4355/dev-install/lib/libgdata.so.0 (0xb7c87000) 

、これは別の1つのケースが、gdatacalendarには、LT-gdatacalendarを作成する原因となりますか?

libgdataにLDDの出力は次のとおりです。

[email protected]:~/workspaces/4355/libgdata$ ldd /home/altern8/workspaces/4355/libgdata/src/.libs/libgdata.so.0 
     linux-gate.so.1 => (0xb7f7c000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7f3b000) 
     libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7dec000) 
     /lib/ld-linux.so.2 (0xb7f7d000) 
+0

あなたも、このLT-プレフィックスが実際に何で、LDDのLT-gdatacalendar – Eugene

+0

そしてすべてのあなたのlibs – Eugene

+0

フムにLDDの出力の出力をポストてもらえますか? – Eugene

答えて

1

のautoconfでそれを行う方法がわからないが、最終的なコマンドは-L ../ SRCを持っている必要がある場合がありますので、リンカは最初に、新しく作成したライブラリを見つけることができます。

最後に追加したコマンドを手動で実行し、それが役立つかどうかを確認してください。

編集:OK、間違っていると思いますが、リンクしていないと思っていましたが、リンクしているが実行されていません。

この場合、バイナリでlddを実行し、インストールされた(ほとんどの場合はインストールされた)古いものを参照してください。

この場合、実行する前に更新されたlibsをインストールするか、実行前にLD_LIBRARY_PATH env変数をエクスポートしてください。

export LD_LIBRARY_PATH="/path to freshly built libs" 
+0

アドバイスをいただきありがとうございますが、これは役に立たなかったようです。 –

1

私は依存関係が正しく動作するために、あなたはLDADDで相対パスでlibgdata.laを参照する必要があることを知っています。あなたが描いている状況にも影響を与える可能性があります。

私は理由は分かりません。あなたが描いている振る舞いはちょっと変わったようです。おそらくlibtool開発者に報告する価値があります。

2

私はこれを分類したと思います。

"../src/libgdata.so"の部分が表示される前に、コマンドラインでlibtoolが "-L"フラグを参照するという問題があります。この場合、その "-L"パスに対して "-Wl、-rpath、..."を指定してリンカを実行します。そのパスに "libgdata.so"が含まれている場合は、そのパスが常に使用されます。私の場合は

、私はこのように好きに "prog_LDADD" を再配置しました:お使いの場合には

"$(DEPENDENCY_LIBS)/src/my_lib.so prog_LDADD = $(top_builddir)" 、削除しようとしますAM_LDFLAGSと書き込み:

LDADD = $(top_builddir)/src/libgdata.laの$(APIUTIL_LIBS)-no-インストールのlibtoolなし

+0

私はこのプロジェクトに戻ったときにそれを試してみる必要があります。 LDADD = $(top_builddir)/src/.libs/libgdata.aこれはテストディレクトリ用のものであったため、これは問題ありませんでした。 –

+0

これは私を助けませんでした。 –

0

は、スクリプトのラッパーを作成し、.LIBS /サブディレクトリに実行ファイルを置く(とリンクライブラリがインストールされています)。ラッパーを呼び出すと、ローカル(インストールされていない)ライブラリとの実行可能なロード/リンクが作成されます。 make checkは、インストールされたばかりの新しく焼かれたライブラリをテストしません。

場合によっては(デバッグやvalgrindingの場合など)、ラッパーは必要ありませんが、ローカルライブラリに直接リンクされている実際の実行可能ファイルがあります。このためには、AM_LDFLAGS = -no-installを使用します(または、単一のターゲットに対してのみ設定します)。

詳細here

関連する問題