我目前有一个大型项目,包括多个应用程序,我正在尝试构建一个静态库以及我的一个应用程序,以包含在其他几个应用程序中。
我按照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文件)。
谢谢!
答案 0 :(得分:1)
这是你的问题:
libas2transition_a_SOURCES = # <-- You forgot a '\'
TransitionFormatter.re2c \
TransitionPath.cpp \
Timestep.cpp \
Predicate.cpp \
StringUtils.cpp
这意味着automake看到了一个空的源列表。