automake 使用指南

automake 使用指南转自 https blog csdn net trochiluses article details 在构建大型的 C C 项目时 往往需要借助 Makefile 然而手动编写 makefile 是相当复

大家好,欢迎来到IT知识分享网。

转自:automake 使用指南_automake 递归添加源文件-CSDN博客

在构建大型的C/C++项目时,往往需要借助Makefile. 然而手动编写makefile是相当复杂的,这一点在程序需要跨平台的时候表现地更为明显。在此背景下,我们需要借助于一些自动化的工具来生成Makefile和configure。本文主要介绍autoconf, automake等自动化工具,默认读者已经具备linux shell脚本和makefile的基础知识。

1. 工具准备

autoconf,automake,libtool等工具

autoconf,automake:

  1. IBM Developer
  2. automake

libtool简介:libtool简介-CSDN博客

2. 实例一

2.1 初始文件模板与源程序

先来看看整个project的构成:其中源程序文件有三个test.c , test.h, main.c ,其他的文件是我们在编译过程中自动和手动生成的。

|-- Makefile.am |-- configure.ac |-- lib | |-- test.c | `-- test.h `-- main |-- Makefile.am `-- main.c

与Makefile和configure有关的配置文件我们放在后面介绍,这里给出工程文件的相关code。

/* project/main.c */ #include <stdio.h> #include "test.h" int main() { printf("main entrance.\n"); test_method(); return 0; } /* project/lib/test.c */ #include <stdio.h> #include "../include/test.h" void test_method() { printf("test method.\n"); } //test.h void test_method();

2.2 生成configure模板configure.in

$ autoscan 

这条命令,会根据当前目录下地源程序结构,生成对应的configure.scan模板,根据这个文件,修改成configure文件模板,configure.in,这个文件是生成configure文件的基础。如果我们需要定义一些configure的具体参数,那么我们需要更改这个模板。实际上在大型项目的构建过程中,这个文件正是初始的几个需要手动编写的文件之一。如何编写configure.in文件,我们将在其他地方说明。

#config.scan -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([lib/test.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile main/Makefile]) AC_OUTPUT 

将上述文件进行改动如下:

//config.in # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([lib/test.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile main/Makefile]) AC_OUTPUT

2.3 生成configure文件

执行命令aclocal和autoconf,分别会产生aclocal.m4及configure两个文件。

2.4 新建Makefile.am

automake将根据Makefile.am生成Makefile.in.从上面的目录结构中,我们可以看到,这个项目中含有两个Makefile.am,第一个在root目录,第二个在main目录。内容分别如下:

ykhuang@ubuntu:/tmp/project$ cat Makefile.am AUTOMAKE_OPTIONS = foreign SUBDIRS = main ykhuang@ubuntu:/tmp/project$ cat main/Makefile.am AM_CPPFLAGS = -I$(top_srcdir)/lib noinst_PROGRAMS= main main_SOURCES = $(top_builddir)/lib/test.c\ $(top_builddir)/main/main.c

Makefile.am是整个流程中的关键,详细可以参考GNU 相关文档,本文也会在后续的章节中进行介绍。

2.5运行automake,根据Makefile.am生成Makefile.in

$automake

2.6执行configure, 生成Makefile

$configure

3. configure.in的编写规则

configure.in的模板形式如下:

# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([config.h.in]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile main/Makefile]) AC_OUTPUT

Autoconf提供了各种内置的宏,用于检测;AM_INIT_AUTOMAKE && AC_CONFIG_FILES 是两个我们需要的手动加入和编写的宏定义。

4. Makefile.am 编写规则

文件 格式
可执行文件 bin_PROGRAMS = foo
所有*.c文件将被编译成一个目标文件,最后链接成一个可执行文件 foo_SOURCES = foo.c func.c
foo_LDADD =
foo_LDFLAGS =
foo_DEPENDENCIES =
静态库 lib_LIBRARIES = foo.a
foo_a_SOURCES = foo.c func.c
foo_a_LDADD =
foo_a_LDFLAGS =
foo_a_DEPENDENCIES

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMSnoinst_LIBRARIES代替lib_LIBRARIES。同时,这些书写规则都是局部的,仅仅对一个目标起作用。Makefile.am还有一些全局变量,能够作用于所有规则.

全局变量 含义
AM_CPPFLAGS 编译器的-I参数
SUBDIRS 在处理顶层目录之前,先递归处理子目录

系统预定义的两个基本路径

路径名称 含义
$(top_srcdir) 源代码所在目录
$(top_builddir) 编译顶层目录

4.1 在srcdir之外编译文件

在很多情况下,我们并不需要源代码目录和编译目录相同,假设编译顶层目录是build,那么此时我们在build目录下运行configure脚本,就能生成对应Makefile文件,然后运行相关命令即可。具体可以参考GNU相关文档的VPATH章节。

参考

  1. IBM Developer
  2. automake

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118666.html

(0)
上一篇 2025-11-11 14:20
下一篇 2025-11-11 14:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信