gpt4 book ai didi

makefile - 如何在子目录中编写makefile.am?

转载 作者:行者123 更新时间:2023-12-04 04:41:49 25 4
gpt4 key购买 nike

我正在学习自动工具。我的顶级目录结构是这样的

Sample--
src
test
inc

这里 src 包含源文件,inc 包含包含文件,而 test 包含测试套件的文件。假设我想编写一个测试套件,它需要 src 中的一些库如何使用 编写 Makefile.am 的子目录 automake 中的选项?

最佳答案

我从来没有被用于标题的单独目录的想法所吸引。除此之外,src Makefile.am可以简单地使用 AM_CPPFLAGS变量:

AM_CPPFLAGS = -I$(top_srcdir)/inc # and other preprocessor flags.
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = file_1.c file_2.c ... ../inc/file_1.h ../inc/file_2.h ...

理想情况下,您还应该在 libfoo_la_SOURCES 中包含标题。如上所述,因为头文件中的任何更改都需要重新编译源文件。通过将标题放在 src 中目录,我们可以简单地列出 file_1.h , file_2.h等,在 SOURCES初级。

-I$(srcdir)已经提供 automatically ,您不需要将此选项添加到 AM_CPPFLAGS ,前提是标题包含在形式 <file_1.h> 中或 "file_1.h" .

此外,将通过将以下内容添加到 src/Makfile.am 来安装 header 。 :
libfoo_includedir = $(includedir)
libfoo_include_HEADERS = file_1.h file_2.h ...

一个极小的顶级 Makefile.am可能看起来像:
ACLOCAL_AMFLAGS = -I m4 --install # AC_CONFIG_MACRO_DIR([m4]) in configure.ac
SUBDIRS = src tests # depth-first ordering of build.

这给我们留下了 test/Makefile.am :
AM_CPPFLAGS = -I$(top_srcdir)/src # or $(srcdir)/../src
check_PROGRAMS = foo_test
foo_test_SOURCES = foo_test.c
foo_test_LDADD = $(top_builddir)/src/libfoo.la

注意使用 top_builddir - 我们希望能够构建“out-of-tree”。

最后,您可能需要考虑使用以下形式的标题构建库: <foo/file_1.h> .我认为这是一种更好的方法,因为前导目录为库标题提供了一种“命名空间”。例如,
libfoo_includedir = $(includedir)/foo # in foo/Makefile.am

AM_CPPFLAGS = -I$(top_srcdir) # in test/Makefile.am

关于makefile - 如何在子目录中编写makefile.am?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18779712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com