我有一个用 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
(手动)从参数中删除也可以解决问题。