autoconf 和 automake 的通配符
Wildcards with autoconf and automake
我在 Eclipse 中有一个使用 Autoconf 和 Automake 的 C++ 项目。我的(简化的)项目结构如下:
+-- Makefile.am
+-- configure.ac
+-- src/
| +-- 4Bench.cpp
| | +-- Makefile.am
| | +-- folder1/
| | | +-- ...
| | +-- folder2/
| | | +-- ...
| | +-- folder3/
| | | +-- ...
+-- include/
| +-- ...
文件夹 src/ 将包含多个二进制文件(4Bench.cpp 是其中之一),它们将使用位于文件夹 1、文件夹 2 等中的 .cpp 文件。所有头文件都位于 include/ 中。我的 src/Makefile.am 如下所示:
bin_PROGRAMS=4Bench
4Bench_SOURCES=4Bench.cpp folder1/file11.cpp folder2/file21.cpp ...
4Bench_CPPFLAGS=-I$(top_srcdir)/include
AM_CPPFLAGS=$(BOOST_CPPFLAGS)
AM_LDFLAGS=$(BOOST_LDFLAGS)
4Bench_LDADD=$(BOOST_PROGRAM_OPTIONS_LIB)
因为我希望在 src/ 的子文件夹中有很多文件,所以我想使用通配符来得到类似的东西:
4Bench_SOURCES=4Bench.cpp $(wildcard folder1/*.cpp) $(wildcard folder2/*.cpp) $(wildcard folder3/*.cpp)
不幸的是,这会导致一堆 "undefined reference" 形式的错误,即编译器无法在 .cpp 文件中找到 类 的实现。枚举二进制文件所需的每个文件。为了进一步参考,我同时提供了 ./configure.ac 和 ./Makefile.am 文件。
./configure.ac
AC_PREREQ(2.59)
AC_INIT(4Bench, 0.1)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects -Wno-portability])
AC_PROG_CXX
AC_CONFIG_MACRO_DIR([m4])
AX_CXX_COMPILE_STDCXX_11
AX_BOOST_BASE([1.32],,[AC_MSG_ERROR([4Bench needs Boost, but it was not found in your system])])
AX_BOOST_PROGRAM_OPTIONS
AX_BOOST_UNIT_TEST_FRAMEWORK
AC_CONFIG_FILES(Makefile src/Makefile test/Makefile)
AC_OUTPUT
./Makefile.am
SUBDIRS=src test
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
EXTRA_DIST = bootstrap
关于如何解决这个问题有什么想法吗?我正在使用 Linux Mint 18 和 g++ 5.4.0、autoconf 2.69 和 GNU automake 1.15。感谢您的关注与帮助!
Any ideas about how to solve the issue?
您无法使用 automake
的当前实现来做到这一点。 This is a feature.
我在 Eclipse 中有一个使用 Autoconf 和 Automake 的 C++ 项目。我的(简化的)项目结构如下:
+-- Makefile.am
+-- configure.ac
+-- src/
| +-- 4Bench.cpp
| | +-- Makefile.am
| | +-- folder1/
| | | +-- ...
| | +-- folder2/
| | | +-- ...
| | +-- folder3/
| | | +-- ...
+-- include/
| +-- ...
文件夹 src/ 将包含多个二进制文件(4Bench.cpp 是其中之一),它们将使用位于文件夹 1、文件夹 2 等中的 .cpp 文件。所有头文件都位于 include/ 中。我的 src/Makefile.am 如下所示:
bin_PROGRAMS=4Bench
4Bench_SOURCES=4Bench.cpp folder1/file11.cpp folder2/file21.cpp ...
4Bench_CPPFLAGS=-I$(top_srcdir)/include
AM_CPPFLAGS=$(BOOST_CPPFLAGS)
AM_LDFLAGS=$(BOOST_LDFLAGS)
4Bench_LDADD=$(BOOST_PROGRAM_OPTIONS_LIB)
因为我希望在 src/ 的子文件夹中有很多文件,所以我想使用通配符来得到类似的东西:
4Bench_SOURCES=4Bench.cpp $(wildcard folder1/*.cpp) $(wildcard folder2/*.cpp) $(wildcard folder3/*.cpp)
不幸的是,这会导致一堆 "undefined reference" 形式的错误,即编译器无法在 .cpp 文件中找到 类 的实现。枚举二进制文件所需的每个文件。为了进一步参考,我同时提供了 ./configure.ac 和 ./Makefile.am 文件。
./configure.ac
AC_PREREQ(2.59)
AC_INIT(4Bench, 0.1)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects -Wno-portability])
AC_PROG_CXX
AC_CONFIG_MACRO_DIR([m4])
AX_CXX_COMPILE_STDCXX_11
AX_BOOST_BASE([1.32],,[AC_MSG_ERROR([4Bench needs Boost, but it was not found in your system])])
AX_BOOST_PROGRAM_OPTIONS
AX_BOOST_UNIT_TEST_FRAMEWORK
AC_CONFIG_FILES(Makefile src/Makefile test/Makefile)
AC_OUTPUT
./Makefile.am
SUBDIRS=src test
ACLOCAL_AMFLAGS = ${ACLOCAL_FLAGS} -I m4
EXTRA_DIST = bootstrap
关于如何解决这个问题有什么想法吗?我正在使用 Linux Mint 18 和 g++ 5.4.0、autoconf 2.69 和 GNU automake 1.15。感谢您的关注与帮助!
Any ideas about how to solve the issue?
您无法使用 automake
的当前实现来做到这一点。 This is a feature.