automake -- SUBDIRS --“没有这样的文件或目录”

问题描述 投票:0回答:1

我正在使用 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
makefile autotools automake
1个回答
0
投票

看来您一定忘记将

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
    中)。

© www.soinside.com 2019 - 2024. All rights reserved.