介绍
在本实验中,我们将探索 Linux 中 autoconf
命令的用途和用法。autoconf
是一个用于生成 shell 脚本的工具,这些脚本可以自动配置软件源代码包,以适应多种类 Unix 系统。我们将从安装 autoconf
包开始,然后创建一个简单的 C 程序,并使用 autoconf
生成必要的配置文件。最后,我们将为更复杂的项目自定义 autoconf
配置文件。
在本实验中,我们将探索 Linux 中 autoconf
命令的用途和用法。autoconf
是一个用于生成 shell 脚本的工具,这些脚本可以自动配置软件源代码包,以适应多种类 Unix 系统。我们将从安装 autoconf
包开始,然后创建一个简单的 C 程序,并使用 autoconf
生成必要的配置文件。最后,我们将为更复杂的项目自定义 autoconf
配置文件。
autoconf
命令的用途和用法在这一步中,我们将探索 Linux 中 autoconf
命令的用途和用法。autoconf
是一个用于生成 shell 脚本的工具,这些脚本可以自动配置软件源代码包,以适应多种类 Unix 系统。
首先,让我们安装 autoconf
包:
sudo apt-get update
sudo apt-get install -y autoconf
示例输出:
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
m4 perl
Suggested packages:
autoconf-archive gnu-standards autoconf-doc
The following NEW packages will be installed:
autoconf m4 perl
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,245 kB of archives.
After this operation, 5,138 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
autoconf
命令用于从模板文件(通常命名为 configure.ac
或 configure.in
)生成配置脚本(通常命名为 configure
)。这些配置脚本随后用于配置源代码,以便在目标系统上进行编译和安装。
以下是一个简单的 autoconf
使用示例:
## 创建一个简单的 C 程序
cat > hello.c << EOF
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
EOF
## 创建 configure.ac 文件
cat > configure.ac << EOF
AC_INIT([hello], [1.0], [[email protected]])
AC_PROG_CC
AC_OUTPUT([Makefile])
EOF
## 生成 configure 脚本
autoconf
现在,让我们运行生成的 configure
脚本并构建程序:
./configure
make
示例输出:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
configure: creating ./config.status
config.status: creating Makefile
make all-am
make[1]: Entering directory '/home/labex/project'
gcc -g -O2 -o hello hello.c
make[1]: Leaving directory '/home/labex/project'
autoconf
命令生成 configure
脚本,该脚本随后用于配置源代码以进行编译和安装。configure
脚本检测系统的特性和功能,并生成一个可用于构建软件的 Makefile。
autoconf
配置并构建一个简单的 C 程序在这一步中,我们将使用 autoconf
命令来配置并构建一个简单的 C 程序。
首先,让我们创建一个名为 hello.c
的简单 C 程序:
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
接下来,我们将创建 configure.ac
文件,autoconf
使用该文件生成 configure
脚本:
cat > configure.ac << EOF
AC_INIT([hello], [1.0], [[email protected]])
AC_PROG_CC
AC_OUTPUT([Makefile])
EOF
现在,让我们生成 configure
脚本:
autoconf
示例输出:
configure.ac:1: installing './install-sh'
configure.ac:1: installing './missing'
生成了 configure
脚本后,我们现在可以运行它来配置项目:
./configure
示例输出:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
configure: creating ./config.status
config.status: creating Makefile
最后,我们可以使用 make
构建程序:
make
示例输出:
make all-am
make[1]: Entering directory '/home/labex/project'
gcc -g -O2 -o hello hello.c
make[1]: Leaving directory '/home/labex/project'
现在,hello
可执行文件已经构建完成,可以运行了。
autoconf
配置文件在这一步中,我们将探索如何为更复杂的项目自定义 autoconf
配置文件。
虽然前面的步骤涵盖了一个简单的 C 程序,但实际项目通常有更复杂的需求,例如支持多个平台、检查依赖项以及自定义构建过程。
让我们首先创建一个更复杂的项目结构:
mkdir -p myproject/src
cat > myproject/src/main.c << EOF
#include <stdio.h>
#include "myheader.h"
int main() {
printf("Hello, %s!\n", get_greeting());
return 0;
}
EOF
cat > myproject/src/myheader.h << EOF
#ifndef MYHEADER_H
#define MYHEADER_H
char* get_greeting();
#endif
现在,我们将创建 configure.ac
文件以处理这个更复杂的项目:
cd myproject
cat > configure.ac << EOF
AC_INIT([myproject], [1.0], [[email protected]])
AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_HEADERS([config.h])
AC_PROG_CC
AC_CHECK_HEADERS([stdlib.h])
AC_OUTPUT([Makefile src/Makefile])
EOF
这个 configure.ac
文件中的关键变化包括:
AC_CONFIG_SRCDIR([src/main.c])
:指定主源文件的位置。AC_CONFIG_HEADERS([config.h])
:生成一个 config.h
头文件,供项目使用。AC_CHECK_HEADERS([stdlib.h])
:检查 stdlib.h
头文件是否存在。AC_OUTPUT([Makefile src/Makefile])
:为项目生成 Makefile。现在,让我们生成 configure
脚本并构建项目:
autoconf
./configure
make
示例输出:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for stdlib.h... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
make all-recursive
make[1]: Entering directory '/home/labex/myproject'
Making all in src
make[2]: Entering directory '/home/labex/myproject/src'
gcc -DHAVE_CONFIG_H -I. -g -O2 -c main.c
gcc -g -O2 -o myproject main.o
make[2]: Leaving directory '/home/labex/myproject/src'
make[1]: Leaving directory '/home/labex/myproject'
生成的 configure
脚本现在可以处理更复杂的项目结构,包括 myheader.h
头文件和由 autoconf
生成的 config.h
头文件。
在本实验中,我们首先学习了 Linux 中 autoconf
命令的用途和用法,这是一个用于生成 shell 脚本的工具,这些脚本可以自动配置软件源代码包,以适应各种类 Unix 系统。接着,我们通过创建 configure.ac
文件并生成 configure
脚本,使用 autoconf
配置并构建了一个简单的 C 程序。最后,我们探索了如何为更复杂的项目自定义 autoconf
配置文件。