0

autoconf、automake、libtoolでビルドされた新しいc++プロジェクトがあります。機能は、サポートライブラリとユーザーバイナリに分けられます。unittestsこれらのライブラリにリンクし、一度にビルドおよび実行されるが、インストールされていないバイナリのセットもありmake checkます。

プロジェクトは新しいと言いました。私は実際、インストールする必要のある最初のライブラリを抽出することに取り掛かっています。これまで、(少量の)記述されたコードは直接にコンパイルされていましたunittests

私が試したMakefile.amスニペットは次のようになります。

lib_LTLIBRARIES += libfoo.la
libfoo_la_SOURCES = foo.cc

で、私はこれmake checkを取得します:

/bin/bash ./libtool --tag=CXX   --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath /usr/local/lib  -o libfoo.la -rpath /usr/local/lib foo.lo  -lboost_thread-mt -lboost_system-mt -pthread 
libtool: link: g++  -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.6.1/crtbeginS.o  .libs/foo.o   -L/usr/local/lib -lboost_thread-mt -lboost_system-mt -L/usr/lib/gcc/x86_64-linux-gnu/4.6.1 -L/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/4.6.1/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crtn.o  -fprofile-arcs -O0 -fprofile-arcs -Wl,-rpath -pthread   -pthread -Wl,-soname -Wl,libfoo.so.0 -o .libs/libfoo.so.0.0.0
/usr/bin/ld: cannot find libfoo.so.0: No such file or directory
collect2: ld returned 1 exit status

欠落しているライブラリは、まさに私がコンパイルしようとしているライブラリであることに注意してください。

(ライブラリはそうではありませんlibfooが、このスタブライブラリで同じエラーを再現できます。上記のMakefile.amおよびエラー行はリテラルであり、編集されていません。)

automake行をに変更すると

check_LTLIBRARIES += libfoo.la
libfoo_la_SOURCES = foo.cc

コンパイルは次のようになります。

/bin/bash ./libtool --tag=CXX   --mode=link g++ -Wall -Wextra -Werror -ansi -fprofile-arcs -ftest-coverage -g -O0 -fprofile-arcs -ftest-coverage -L/usr/local/lib -Wl,-rpath /usr/local/lib  -o libfoo.la  foo.lo  -lboost_thread-mt -lboost_system-mt -pthread 
libtool: link: ar cru .libs/libfoo.a .libs/foo.o 
libtool: link: ranlib .libs/libfoo.a
libtool: link: ( cd ".libs" && rm -f "libfoo.la" && cp -p "../libfoo.la" "libfoo.la" )

..そしてすべてが正常に動作します(私のライブラリがインストールされていないことを除いて、にありcheck_ます。)

コマンドラインの唯一の違いは、2番目の引数のいくつかの追加の引数であることに注意してください。

... -Wl、-rpath / usr / local / lib -o libfoo.la -rpath / usr / local / lib foo.lo-lboost_thread-mt..。

この新しい議論がそこにあるべきではないかどうかはわかりませんが、それが問題を引き起こしているように見えます。誰かが私が欠けているものを知っていますか?

詳細:

  • osx lionでは、これは正常に機能します(コマンドラインは異なります)。このエラーは、ubuntu 12.04、場合によっては他のLinuxで発生します。
  • noinst_LTLIBRARIESEXTRA_LTLIBRARIESように機能check_LTLIBRARIESします:余分な引数はなく、リンクします。libtoolの「コンビニエンス」ライブラリは、特にこれらの引数がないライブラリのようです。
  • automake 1.11.1
  • autoconf 2.68
  • libtool 2.4

編集

(手動で)-Wl,-rpath /usr/local/lib引数から削除すると、問題も修正されます。

4

1 に答える 1

0

私は自分でそれをしました。ブーストのautoconfサポートを導入しているときに、ここで説明するバグに遭遇しました。私の回避策は、1つの投稿の提案に従いました:

diff --git a/m4/boost.m4 b/m4/boost.m4
index 3d4e47c..9dd0c43 100644
--- a/m4/boost.m4
+++ b/m4/boost.m4
@@ -403,7 +403,7 @@ dnl generated only once above (before we start the for loops).
       LDFLAGS=$boost_save_LDFLAGS
       LIBS=$boost_save_LIBS
       if test x"$Boost_lib" = xyes; then
-        Boost_lib_LDFLAGS="-L$boost_ldpath -Wl,-R$boost_ldpath"
+        Boost_lib_LDFLAGS="-L$boost_ldpath -Wl,-rpath $boost_ldpath"
         Boost_lib_LDPATH="$boost_ldpath"
         break 6
       else

ここ-rpathで紹介したのは、明らかに問題を引き起こしているものと同じです。この変更を元に戻すと、問題は解決します(もちろん、最初の問題は残りますが、それは別の話です)。

于 2012-06-23T09:06:29.207 に答える