最近在linux下写C++程序比较多,之前在linux下写小程序的时候一般都是自己手写makefile,现在发现写这个玩意对于文件与依赖比较多的情况下不是很好用,而且也有点浪费时间,然后听说automake这个工具比较好用,就拿来使用下,确实很好用,先将一些简单的配置与使用方法写下来。
先说安装,我的是ubuntu系统,直接两条命令搞定:
sudo apt-get install autoconf
sudo apt-get install libtool
安装完成之后就可以使用了,automake的使用其实非常简单,为了生成makefile,我们只需要指定需要生成makefile的文件夹与需要编译的源代码文件就可以了。
再说方法之前先说下这个工具大概的工作原理吧,这是一个递归产生Makefile的工具,这个跟Makefile中命令的执行有着相似之处,都是从最顶层开始生成,然后发现依赖了之后向下一层去递归寻找的。
下面开始说具体的方法。
在automake的使用中,有两个需要配置的文件,一个是configure.ac或者configure.in随便取哪个名字都可以,另一个是makefile.am,下面分别说明:
比如我的工程中有如下两个源文件夹,test1与test2,每个里面有一个cpp文件,test1.cpp test2.cpp,那么我们首先在工程最上层目录建立两个文件,一个是configure.ac,另一个是Makefile.am,然后再每个子文件夹中建立一个Makefile.am文件,如下所示,如果你只有一个源代码文件夹的话可以直接在所有代码那一层建立这两个文件即可。
lsk@lsk-VirtualBox:~/automake_test$ ls
configure.ac Makefile.am test1 test2
lsk@lsk-VirtualBox:~/automake_test/test1$ ls
Makefile.am test1.cpp
lsk@lsk-VirtualBox:~/automake_test/test2$ ls
Makefile.am test2.cpp
如果你是第一次使用automake,那么你可以使用autoscan这个命令将文件夹下的文件扫描下产生configure.scan,之后重命名等,然后再进行aclocal等命令,但是我觉得完全不必要这样,可以直接拷贝一个写好的configure.ac 和makefile.am放进自己的工程,然后按照自己的工程修改这样效率更高,下面说下我的方法。
下面是我的configure.ac和Makefile.am文件内容:
configure.ac
# -*- Autoconf -*-
2 # Process this file with autoconf to produce a configure script.
3
4 AC_PREREQ([2.69])
5 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
6 AM_INIT_AUTOMAKE(test,1.0) #这里test的位置填写自己的工程的名字
7 AC_CONFIG_SRCDIR([test1],[test2]) #这里填写源文件目录,如果为当前目录则填写[./],如果有其他目录则每增加一个,以逗号分隔,填在中括号内
8 AC_CONFIG_HEADERS([config.h]) #工具自动生成的,不需要改
9
10 # Checks for programs.
11 AC_PROG_CXX
12 AC_PROG_CC
13
14 # Checks for libraries.
15 AC_CHECK_LIB([jrtp],[x264]) #这里添加自己需要动态链接的库,如果没有这一行可以注释掉
16 # Checks for header files.
17 AC_CHECK_HEADERS([malloc.h memory.h stdint.h stdlib.h string.h])
18
19 # Checks for typedefs, structures, and compiler characteristics.
20 AC_CHECK_HEADER_STDBOOL
21 AC_TYPE_UINT16_T
22 AC_TYPE_UINT32_T
23 AC_TYPE_UINT64_T
24 AC_TYPE_UINT8_T
25
26 # Checks for library functions.
27 AC_CHECK_FUNCS([memset strchr strtol])
28 AC_CONFIG_FILES([
29 test1/Makefile #这里填写要生成makefile的路径,我这里要在test1下和test2下生成,并没有在最顶层生成。
30 test2/Makefile
31 ])
32 AC_OUTPUT
Makefile.am
这是test1下的makefile.am,因为顶层文件夹不需要生成可执行程序,因此里面只需要下面文件的第一句就行了。
test2仿照test1写就ok了。
1 AUTOMAKE_OPTIONS = foreign
2 bin_PROGRAMS = test1 #这里写自己要生成的可执行程序的名字
3 test1_SOURCES = test1.cpp #这里写要生成可执行程序需要的源文件,头文件
4 test1_LDADD=-ljrtp -lx264 #这里写依赖的库,如果依赖的库目录不在系统环境变量中,需要在configure.ac中写出来函数库的路径
这两个文件写好后,直接使用一个命令:
autoreconf -isv 就可以直接生成configure文件,不需要执行aclocal,autoconf 等命令,这里,isv三个参数分别代表:
i 自动安装缺失的辅助文件,如果不设置则会提示你缺少missing文件
s对于缺失文件,建立软链而不是拷贝过来
v打印运行时的所有信息
如果想对该命令有更多了解,可以参看其官方文档:http://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.69/html_node/autoreconf-Invocation.html
这样就能生成configure文件,运行命令:
./configure
然后make就能生成可执行文件了
我的test1.cpp 与test2.cpp 文件内容分别为:
1 #include
2 using namespace std;
3 int main(){
4 cout<<"hello world 1"<
1 #include
2 using namespace std;
3
4 void printInfo(){
5 cout<<__FILE__<<__TIME__<
进入test1文件夹,make
然后./test1
输出为:
lsk@lsk-VirtualBox:~/automake_test/test1$ ./test1
hello world 1
运行成功。