我的lib_LTLIBRARIES库链接,但check_LTLIBRARIES一个没有?

时间:2012-06-23 07:33:41

标签: linux linker autotools automake libtool

我有一个使用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_。)

注意命令行中唯一的区别是第二个中的一些附加参数:

... -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也可以解决问题。

1 个答案:

答案 0 :(得分:0)

我自己做了。在为boost提供autoconf支持的同时,我遇到了一个描述here的错误。我的解决方案遵循了一个帖子的建议:

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显然是同一个问题。如果我恢复这个改变,问题就会消失(我当然会留下第一个问题,但这是另一个故事。)