我正在使用 autoconf/automake 作为我的构建系统。到目前为止,它运行得很好。但是,我想将一些代码拆分到另一个库中,我将从主库中动态加载该库。这是我遇到的问题。
Makefile.am
结构如下:
# Makefile.am
SUBDIRS = lib test bin stages_lib
ACLOCAL_AMFLAGS = -I m4
CLEANFILES = *.o
CLEANDIRS = deps/ .lib/
# stages_lib/Makefile.am
SUBDIRS = lib
# stages_lib/lib/Makefile.am
lib_LTLIBRARIES = libstages_lib.la
libstages_lib_la_CPPFLAGS = -Werror -Wall -pedantic \
-I$(abs_top_srcdir)/include/ \
-I$(abs_top_srcdir)/stages_lib/include \
-I$(abs_top_srcdir)/deps/build/boost/include
libstages_lib_la_SOURCES = print_stage.cxx
libstages_lib_la_LDFLAGS = -L$(abs_top_srcdir)/deps/build/boost/lib
if LINUX
libstages_lib_la_LDFLAGS += -L$(abs_top_srcdir)/deps/build/openssl/lib64
else
libstages_lib_la_LDFLAGS += -L$(abs_top_srcdir)/deps/build/openssl/lib
endif
libstages_lib_la_LDFLAGS += -libdag_scheduler -lboost_filesystem -lboost_log -lboost_system \
-lboost_thread -lssl -lcrypto -pthread
if LINUX
libstages_lib_la_LIBADD = $(INIT_LIBS) -lm
else
libstages_lib_la_LIBADD = $(INIT_LIBS)
endif
通过此设置,请注意
lib
、test
和 bin
SUBDIRS 构建得很好。当我从项目的根目录运行以下命令时:
> autoreconf -i
> rm -rf ./build && mkdir -p ./build
> cd build/ && ../configure
> cd ../
> make -C build
我现在收到以下错误:
Making all in stages_lib
/bin/sh: line 0: cd: stages_lib: No such file or directory
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
看来您一定忘记将
stages_lib/Makefile
和 stages_lib/lib/Makefile
添加到 AC_CONFIG_FILES
中的 configure.ac
列表中。假设您在提到的每个目录中都有一个 Makefile.am
,并且没有目录逃脱提及,那么您需要以下内容:
AC_CONFIG_FILES([
Makefile
lib/Makefile
test/Makefile
bin/Makefile
stages_lib/Makefile
stages_lib/lib/Makefile
])
如果不创建 configure
目录,
stages_lib
无法在构建目录中生成这些文件,但 make
否认该目录存在。
补充说明:
Automake 已经知道如何清洁。只有在特殊情况下,您才需要使用
CLEANFILES
告诉它要清理的文件 - 通常这是在您添加了自定义规则时。但是,当您do使用CLEANFILES
用于此目的时,您应该指定实际的文件名,而不是glob。
据我所知,
CLEANDIRS
对Automake没有意义。它肯定没有记录在当前手册中。
您可以将
-L
选项放入 foo_LDFLAGS
或 foo_LIBADD
中,但 -l
选项只能放入 foo_LIBADD
中(如果 foo_LDADD
是程序,则放入 foo
中)。