Automake中SUBDIRS报错“No such file or directory”问题求助
Autoconf/Automake 动态库拆分构建错误解决
我使用Autoconf/Automake作为构建系统,此前运行正常。现需将部分代码拆分到一个可被主库动态加载的新库中,却遇到构建错误。
当前Makefile.am结构
根目录Makefile.am
# Makefile.am SUBDIRS = lib test bin stages_lib ACLOCAL_AMFLAGS = -I m4 CLEANFILES = *.o CLEANDIRS = deps/ .lib/
stages_lib/Makefile.am
# 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
构建命令
执行以下构建步骤:
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
问题原因
错误核心是out-of-tree构建时,Automake无法在build目录下找到stages_lib子目录。原因是根目录的configure.ac未声明要生成stages_lib及其子目录的Makefile,导致configure执行时未在build目录下创建对应子目录,也未生成相关Makefile,最终make尝试进入不存在的目录报错。
解决步骤
修改根configure.ac:
在AC_CONFIG_FILES块中添加stages_lib/Makefile和stages_lib/lib/Makefile,示例如下:AC_CONFIG_FILES([ Makefile lib/Makefile test/Makefile bin/Makefile stages_lib/Makefile stages_lib/lib/Makefile ])重新生成配置文件:
autoreconf -i重新执行构建:
rm -rf ./build && mkdir -p ./build cd build/ && ../configure make
这样就能让Automake正确处理新增的子目录,完成动态库的构建。
内容的提问来源于stack exchange,提问作者Matthew Hoggan
相关产品推荐
相关产品推荐

