Automake不包括构建静态库中的目标文件

时间:2013-04-01 04:12:51

标签: static-libraries autoconf automake

我目前有一个大型项目,包括多个应用程序,我正在尝试构建一个静态库以及我的一个应用程序,以包含在其他几个应用程序中。

我按照http://www.gnu.org/software/automake/manual/html_node/A-Library.html提供的教程编写了相应的Makefile.am,如下所示:

include Makefile.shared

noinst_LIBRARIES = libas2transition.a
bin_PROGRAMS = as2transition

BUILT_SOURCES = \
    TransitionFormatter.cpp

libas2transition_a_SOURCES =
    TransitionFormatter.re2c \
    TransitionPath.cpp \
    Timestep.cpp \
    Predicate.cpp \
    StringUtils.cpp

as2transition_SOURCES = \
    main.cpp

as2transition_LDADD = libas2transition.a

Makefile.shared包含我所有子项目的共享配置,并包含:

if DEBUG
AM_CFLAGS = -g3 -O0 -DDEBUG
AM_CXXFLAGS = -g3 -O0 -DDEBUG --std=c++0x
else
AM_CFLAGS = -O3 -DNDEBUG
AM_CXXFLAGS = -O3 -DNDEBUG --std=c++0x
endif

if MAINTAINER_MODE
if HAVE_RE2C
.re2c.cpp:
    $(RE2C) -o $@ $^
else
.re2c.cpp:
    @- echo "ERROR: Configured to build in maintainer mode but re2c is not installed on the computer."
    @- echo "ERROR: Modified re2c files cannot be compiled into the corresponding .cpp file."
    @- echo "ERROR: Please install re2c before continuing."
    @- exit 1
endif
else
.re2c.cpp:
    @- echo "WARNING: The system must be configured to build in maintainer mode in order to rebuild re2c files."
    @- echo "WARNING: These files will not be rebuilt unless you rerun the configure script with the '--enable-maintainer-mode' flag."
endif

据我所知,一切都设置正确,首先构建静态库libas2transition.a,然后编译一个二进制链接。但是,当我尝试运行make时,我得到以下输出(请注意,这是一个make clean之后的新构建。)

make  all-am
make[1]: Entering directory `/home/jbabb1/workspace/as2transition/src'
rm -f libas2transition.a
ar cru libas2transition.a
ranlib libas2transition.a
g++ -DHAVE_CONFIG_H -I. -I..    -O3 -DNDEBUG --std=c++0x -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
g++ -O3 -DNDEBUG --std=c++0x -g -O2   -o as2transition main.o libas2transition.a
main.o: In function `as2transition::TransitionFormatter::format(std::basic_istream<char, std::char_traits<char> >&, std::basic_ostream<char, std::char_traits<char> >&, bool) const':
/home/jbabb1/workspace/as2transition/src/TransitionFormatter.h:123: undefined reference to `as2transition::TransitionFormatter::format(std::basic_istream<char, std::char_traits<char> >&, bool) const'
/home/jbabb1/workspace/as2transition/src/TransitionFormatter.h:124: undefined reference to `as2transition::TransitionPath::output(std::basic_ostream<char, std::char_traits<char> >&) const'
main.o: In function `main':
/home/jbabb1/workspace/as2transition/src/main.cpp:136: undefined reference to `as2transition::TransitionFormatter::parseOption(char const*, bool)'
/home/jbabb1/workspace/as2transition/src/main.cpp:193: undefined reference to `as2transition::TransitionFormatter::help(std::basic_ostream<char, std::char_traits<char> >&, bool)'
collect2: ld returned 1 exit status
make[1]: *** [as2transition] Error 1
make[1]: Leaving directory `/home/jbabb1/workspace/as2transition/src'
make: *** [all] Error 2

重要的线条似乎是

rm -f libas2transition.a
ar cru libas2transition.a
ranlib libas2transition.a

这似乎表明Automake没有将任何对象文件附加到构建的库(这在libas2transition.a的文件大小进一步证实为编译后的8个字节)。

我做错了什么?

另外,作为一个后续问题,我如何将这个库提供给更大版本的其他项目(使用嵌套的configure.ac文件)。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是你的问题:

libas2transition_a_SOURCES = # <-- You forgot a '\'
    TransitionFormatter.re2c \
    TransitionPath.cpp \
    Timestep.cpp \
    Predicate.cpp \
    StringUtils.cpp

这意味着automake看到了一个空的源列表。