我在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