我在ubuntu lucid上使用libtool 2.2.6b,在ubuntu上使用libtool 2.4.2精确。在清晰的我的项目将正确链接。在精确它无法链接。下面是示例代码,演示了我的问题;libtool不提供库链接链接
configure.ac
AC_INIT([ltp], [0.0.1], [someone])
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([.m4])
AC_CONFIG_FILES([Makefile foo/Makefile bar/Makefile wah/Makefile])
AC_PROG_CXX
AC_PROG_LIBTOOL
AM_SANITY_CHECK
AC_LANG_CPLUSPLUS
AC_OUTPUT
Makefile.am
SUBDIRS = foo bar wah
ACLOCAL_AMFLAGS = -I .m4
富/ foo.h中
#ifndef FOO_FOO_H_
#define FOO_FOO_H_
namespace Foo
{
class Foo
{
public:
Foo(long l);
private:
long l;
};
}
#endif
富/ Foo.cpp中
#include "foo/Foo.h"
namespace Foo
{
Foo::Foo(long l) : l(l) {}
}
富/ Makefile.am
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = Foo.cpp
libfoo_la_CPPFLAGS =
libfoo_la_LDFLAGS = -release 0.0.1
libfoo_la_LIBADD =
酒吧/ Bar.h
#ifndef BAR_BAR_H_
#define BAR_BAR_H_
#include "foo/Foo.h"
namespace Bar
{
class Bar
{
public:
Bar(const Foo::Foo & f);
private:
Foo::Foo f;
};
}
#endif
酒吧/ Bar.cpp
#include "bar/Bar.h"
namespace Bar
{
Bar::Bar(const Foo::Foo & f) : f(f) { }
}
酒吧/ Makefile.am
lib_LTLIBRARIES = libbar.la
libbar_la_SOURCES = Bar.cpp
libbar_la_CPPFLAGS =
libbar_la_LDFLAGS = -release 0.0.1
libbar_la_LIBADD = -L../foo -lfoo
wah/main.cpp
#include "bar/Bar.h"
int main(int argc, char * argv[])
{
Bar::Bar(5);
return 0;
}
华/ Makefile.am
bin_PROGRAMS = wah
wah_SOURCES = main.cpp
wah_CPPFLAGS =
wah_LDADD = -L../bar -lbar
在清醒,华环节,对精确,它失败:
wah/main.cpp:5 undefined reference to `Foo::Foo::Foo(long)'
我可以通过添加-L../foo -lfoo
到wah_LDADD
解决这个问题,但真正,是不是libtool应该为我自动做到这一点?关于“链接可执行文件”的libtool手册部分似乎表明,它正是它应该做的。
libfoo_LIBADD,libbar_LIBADD,libfoo_LDFLAGS,libbar_LDFLAGS是什么样的?标志'-ldl -lboost_filesystem -lboost_system'是它们各自库的依赖关系,而不是测试可执行文件。由于这些是共享库(不是静态的),为什么你认为第二行是错误的? – ldav1s 2012-08-08 23:43:05
libfoo_la_LDFLAGS = -release $(PACKAGE_VERSION) libfoo_la_LIBADD = -L $(LIBDIR)-lboost_filesystem -ldl libbar_la_LDFLAGS = -release $(PACKAGE_VERSION) libbar_la_LIBADD = -L $(LIBDIR)-lfoo -lboost_system – CAB 2012-08-10 13:33:10
一个可执行文件的链接与exe_LDADD -lbar链接并运行没有错误。我将不得不更仔细地观察那里发生的事情。所以,我认为单元测试的可执行文件会是类似的。虽然,没有AM_LDADD。但是,从libtool手册; “这看起来太简单了,所以libtool所做的就是将libhello.la转换为./.libs/libhello.a,注意Libtool也记得libhello.la依赖于-lm,所以即使我们没有' t在libtool命令行中指定-lm3 Libtool已将它添加到我们的gcc链接行中。“那么这个exe有什么魔力,但不是单元测试? – CAB 2012-08-10 13:40:28