automake自动生成Makefile及遇到的问题
2015-07-08 23:09
267 查看
大家在Linux下面编写工程时可能都要遇到一个同样的问题,就是工程文件太大了编译的问题。我们可以使用很多方法:
1、 最原始的方法是每次编译都写一次gcc命令。
2、 手写Makefile文件,这个的前提是对Makefile的规则很熟悉。
3、 自动生成Makefile文件。
楼主在项目中也是遇到这样的问题,开始文件少的时候我每次都是键入gcc命令,然后各种参数,后面各种文件。但是当C文件变多之后这就是我的梦魇了。我已经无法忍受下去,有时还会敲错,毕竟我们是人,代码写多了之后头脑没那么清醒。所以我就使用了自动生成Makefile的工具,毕竟自己写Makefile也是毕竟耗时的。
我使用的是autoconf + automake的套装,按照网上我也是实践过,但是网上还有一些没有说到的我这里还是想补充一下。
图示:
楼主的文件目录是这样的:
项目目录下面是:------src:存放.c文件
------include:存放头文件
大体上这样就可以生成我们要使用的Makefile文件了,只是步骤中有些地方需要我们修改,是configure.scan。
下面我将引用并添加自己的东西,每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局:
修改后的结果如下:
其中要将AC_CONFIG_HEADER([config.h])修改为:AM_CONFIG_HEADER(config.h),并加入AM_INIT_AUTOMAKE(test,1.0)。由于我们的测试程序是基于多线程的程序,所以要加入AC_PROG_RANLIB,不然运行automake命令时会出错。在AC_OUTPUT输入要创建的Makefile文件名。
由于我们在程序中使用了读写锁,所以需要对库文件进行检查,即AC_CHECK_LIB([pthread],[main]),该宏的含义如下:
Makefile.am文件
Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。
表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
我src下面的Makefile.am是这样的:
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
这里如果你想把你的可执行文件放入另外的文件中的话,你的bin_PROGRAM = /xxx/xxx/test,这里要使用绝对路径,相对路径搂着试了没用,如果有人有另外的方法,请告知楼主,让我这个小白也知道一下。嘻嘻。如果使用绝对路径这里的SOURCES前面就不是test而是_xxx_xxx_test_SOURCES = 这样才有效。
项目下的Makefile.am文件更简单
Makefile.am的全局变量:
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
最后我想说的是,大家在使用这个东西的时候不要在include中定义config.h文件,因为楼主定义了这个文件之后不能正常使用make命令,我觉得是和系统的config.h文件重了现在我还没有搞明白是为啥,如果知道的请告知一下我。
引用:
https://www.ibm.com/developerworks/cn/linux/l-makefile/
1、 最原始的方法是每次编译都写一次gcc命令。
2、 手写Makefile文件,这个的前提是对Makefile的规则很熟悉。
3、 自动生成Makefile文件。
楼主在项目中也是遇到这样的问题,开始文件少的时候我每次都是键入gcc命令,然后各种参数,后面各种文件。但是当C文件变多之后这就是我的梦魇了。我已经无法忍受下去,有时还会敲错,毕竟我们是人,代码写多了之后头脑没那么清醒。所以我就使用了自动生成Makefile的工具,毕竟自己写Makefile也是毕竟耗时的。
我使用的是autoconf + automake的套装,按照网上我也是实践过,但是网上还有一些没有说到的我这里还是想补充一下。
图示:
楼主的文件目录是这样的:
项目目录下面是:------src:存放.c文件
------include:存放头文件
Makefile自动生成的步骤: 1. 运行autoscan命令 2. 将configure.scan 文件重命名为configure.in或者configure.ac,并修改configure.in文件 3. 在project目录下新建Makefile.am文件,并在src文件下创建makefile.am文件 4. 运行aclocal命令 5. 运行autoheader,楼主通过这个命令生成config文件,不然不让我往下执行 6. 运行autoconf命令 7. 运行automake –add-missing命令 8. 运行./confiugre脚本
大体上这样就可以生成我们要使用的Makefile文件了,只是步骤中有些地方需要我们修改,是configure.scan。
下面我将引用并添加自己的东西,每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局:
AC_INIT
测试程序
测试函数库
测试头文件
测试类型定义
测试结构
测试编译器特性
测试库函数
测试系统调用
AC_OUTPUT
修改后的结果如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT(test, 1.0, xxxxx@126.com) #修改
AM_INIT_AUTOMAKE #添加
AC_CONFIG_SRCDIR([src/test.c])
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(test,1.0)
# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [pthread_rwlock_init])
AC_PROG_RANLIB
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT([Makefile
src/Makefile
])
AC_OUTPUT()
其中要将AC_CONFIG_HEADER([config.h])修改为:AM_CONFIG_HEADER(config.h),并加入AM_INIT_AUTOMAKE(test,1.0)。由于我们的测试程序是基于多线程的程序,所以要加入AC_PROG_RANLIB,不然运行automake命令时会出错。在AC_OUTPUT输入要创建的Makefile文件名。
由于我们在程序中使用了读写锁,所以需要对库文件进行检查,即AC_CHECK_LIB([pthread],[main]),该宏的含义如下:
Makefile.am文件
Makefile.am是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。
表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
我src下面的Makefile.am是这样的:
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
这里如果你想把你的可执行文件放入另外的文件中的话,你的bin_PROGRAM = /xxx/xxx/test,这里要使用绝对路径,相对路径搂着试了没用,如果有人有另外的方法,请告知楼主,让我这个小白也知道一下。嘻嘻。如果使用绝对路径这里的SOURCES前面就不是test而是_xxx_xxx_test_SOURCES = 这样才有效。
项目下的Makefile.am文件更简单
Makefile.am的全局变量:
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
最后我想说的是,大家在使用这个东西的时候不要在include中定义config.h文件,因为楼主定义了这个文件之后不能正常使用make命令,我觉得是和系统的config.h文件重了现在我还没有搞明白是为啥,如果知道的请告知一下我。
引用:
https://www.ibm.com/developerworks/cn/linux/l-makefile/
相关文章推荐
- tcp协议的那些事
- 欢迎使用CSDN-markdown编辑器
- RTSP - RTP over TCP
- 打字游戏c语言
- Java Class 是什么
- 黑马day15 文件上传入门
- 2015070805 - 算不算食言呢?
- 关键字volatile有什么含义?并给出三个不同的例子
- Perl 的面向对象编程
- C++加载位图
- [Perl]对 EXCEL 文件进行简单操作
- 对com对象的释放
- Java NIO 系列教程
- CocoaPods 第三方库管理器
- PHP与ECMAScript_5_常用数组相关函数
- ROS的安装
- 操作系统之磁盘调度和管理
- 如何监控GC及内存问题解决方案概述
- 图书管理系统C语言课程设计2
- 均价 和 最新价格 是啥意思 什么是MACD DIFF DEA 指标?