0

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

我按照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 文件)。

谢谢!

4

1 回答 1

1

这是你的问题:

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

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

于 2013-04-02T00:19:10.410 回答