我有一个使用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 ...
我不知道这个新论点是否应该存在,但它似乎确实导致了问题。有谁知道我错过了什么?
更多细节:
noinst_LTLIBRARIES
和EXTRA_LTLIBRARIES
的工作方式与check_LTLIBRARIES
类似:没有额外的参数,而且它会链接。似乎libtool“便利”库特别是那些没有这些论点的库。修改
(手动)从参数中删除-Wl,-rpath /usr/local/lib
也可以解决问题。
答案 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
显然是同一个问题。如果我恢复这个改变,问题就会消失(我当然会留下第一个问题,但这是另一个故事。)