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_。)

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

... -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 'convenience' 库特别是那些没有这些论点的库。
  • 汽车制造 1.11.1
  • 自动配置 2.68
  • 库工具 2.4

编辑

-Wl,-rpath /usr/local/lib(手动)从参数中删除也可以解决问题。

4

1 回答 1

0

我对自己做了。在为 boost 引入 autoconf 支持时,我遇到了此处描述的错误。我的解决方法遵循了一篇帖子的建议:

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 回答