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_LTLIBRARIES
のEXTRA_LTLIBRARIES
ように機能check_LTLIBRARIES
します:余分な引数はなく、リンクします。libtoolの「コンビニエンス」ライブラリは、特にこれらの引数がないライブラリのようです。- automake 1.11.1
- autoconf 2.68
- libtool 2.4
編集
(手動で)-Wl,-rpath /usr/local/lib
引数から削除すると、問題も修正されます。