linux makefile文件怎么生成,Makefile文件生成
所必须的软件:autoconf
(generate configuration script [configuration])
automake( aclocal:automatically generate
aclocal.m4 from configure.in)
m4 perl libtool(其中libtool非必须)。
autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到
m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,
automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种
程序库的工具。
生成Makefile的操作过程如下:
1) 运行autoscan命令
2) 将configure.scan 文件重命名为configure.in,并修改configure.in文件
$sudo mv configure.scan configure.in
3)
在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件
4) 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件
5) 将/usr/share/automake-1.10/目录下的depcomp和complie文件拷贝到本目录下
6) 运行aclocal命令(configure.in-->aclocal.m4)
7) 运行autoconf命令 (configure.in+aclocal.m4 -->
configuration)
8) 运行automake -a命令
(Makefile.am+configuration.in-->Makefile.in)
9) 运行./confiugre脚本
从上图中可以看出,对于用户而言,其中最主要的就是编写configuratio.in
和Makefile.am文件,首先我们来看configuration.in文件,每个configure.scan文件都是以AC_INIT开头,以AC_OUTPUT结束。我们不难从文件中看出confiugre.in文件的一般布局为:测试程序(check
for programs),测试库(libraries),测试头文件(header
file),测试类型定义(typedef),测试结构(constructure),测试编译器特性(compiler
characters),测试库函数(libraries functions);修改后的结果如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
#AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_INIT(test, 1.0, haizi007418@sina.com)
AC_CONFIG_SRCDIR([src/ModuleA/apple/core/test.c])
AM_CONFIG_HEADER(config.h)
# AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
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 #Multithread
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
# 在AC_OUTPUT输入 要创建的Makefile文件名
AC_OUTPUT([Makefile
src/lib/Makefile
src/ModuleA/apple/core/Makefile
src/ModuleA/apple/shell/Makefile
])
其中要将AC_CONFIG_HEADER([config.h])修改为:AM_CONFIG_HEADER(config.h),
并加入AM_INIT_AUTOMAKE(test,1.0);
最后,我们来看看Makefile.am文件,它是一种比Makefile更高层次的规则。只需指定要生成什么目标,它由什么源文件生成,要安装到什么目录等构成。表一列出了可执行文件、静态库、头文件和数据文件,四种书写Makefile.am文件个一般格式。
表 1Makefile.am一般格式
对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。
在Makefile.am中尽量使用相对路径,系统预定义了两个基本路径:
在上文中我们提到过安装路径,automake设置了默认的安装路径:
1) 标准安装路径
默认安装路径为:$(prefix) = /usr/local,可以通过./configure
--prefix=的方法来覆盖。
其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib,
datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。
2) 定义一个新的安装路径
比如test, 可定义testdir = $(prefix)/test, 然后test_DATA =test1
test2,则test1,test2会作为数据文件安装到$(prefix)/ /test目录下。
我们首先需要在工程顶层目录下创建一个Makefile.am来指明包含的子目录,由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含了
编译源文件时所用到的头文件,并导出。
SUBDIRS=src/lib src/ModuleA/apple/shell src/ModuleA/apple/core
CURRENTPATH=$(shell /bin/pwd)
INCLUDES=-I$(CURRENTPATH)/src/include -I$(CURRENTPATH)/src/ModuleA/apple/include
export INCLUDES
我们将lib目录下的swap.c文件编译成libswap.a文件(只想编译,而并不想安装),被apple/shell/apple.c文件调用,那么lib目录下的Makefile.am如下所示:
noinst_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/includ
如果想安装,那么库将会安装到$(prefix)/lib目录下,可执行文件将会安装到${prefix}/bin,则Makefile.am如下:
bin_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include
# 将swap.h安装到${prefix}/include /swap目录下
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h
接下来,对于可执行文件类型的情况,我们将讨论如何写Makefile.am?对于编译apple/core目录下的文件,我们写成的Makefile.am如下所示:
noinst_PROGRAMS=test
test_SOURCES=test.c
# test.c文件在链接时,需要apple.o和
libswap.a文件
test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a
# Linux下的信号量/读写锁文件进行编译,需要在编译选项中指明-
D_GNU_SOURCE
test_LDFLAGS=-D_GNU_SOURCE
# test_LDFLAGS只是链接时的选项,编译时同样需要指明该选项,所以需要
DEFS来指明编译选项
# DEFS已经有初始值,所以这里用+=的形式指明。
DEFS+=-D_GNU_SOURCE
# 如果你的程序还包含其他的库,除了用AC_CHECK_LIB宏来指明外,还可以用LIBS来指明
#LIBS=-lpthread
终结
:
对于一个已有configure.in and Makefile.am
的源程序包,我们只需要通过执行下述命令来生成Makefile文件: aclocal ,
autoconf,automake,./configure 就可以生成Makefile文件,然后sudo make
就开始编译源程序(编译时error),最后sudo make install
安装。运行。。。。。。(可能有运行时error)!
linux makefile文件怎么生成,Makefile文件生成相关推荐
- linux新建好文件后怎么编译,使用autoconf生成Makefile并编译工程的步骤
前言 在Linux下,编译和链接需要用Makefile,而写好一个Makefile可不容易,写出一个规范的Makefile更是麻烦.我们可以利用autoconf来生成一个Makefile,尤其在大型工 ...
- linux清除configure文件_在Linux操作系统下自动生成Makefile的方法
在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...
- linux系统中自动生成snap文件_在Linux操作系统下自动生成Makefile的方法
在Linux操作系统下进行开发,编写Makefile似乎是不可缺少的事情.但是对于一个比较大的工程,编写一个符合规范的Makefile并非易事.而且由于Makefile的各种显式,隐式规则,加之平时并 ...
- 例解 autoconf 和 automake 生成 Makefile 文件
http://www.ibm.com/developerworks/cn/linux/l-makefile/ 生成 Makefile 的来龙去脉 首先进入 project 目录,在该目录下运行一系列命 ...
- Ubuntu下使用cmake结合CmakeLists.txt生成makefile文件并进行编译
转自1:https://www.cnblogs.com/cv-pr/p/6206921.html 转自2:https://blog.csdn.net/qqwangfan/article/details ...
- 例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
引子 无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令.不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install.利用make工具,我们可 ...
- CodeBlocks自动生成makefile文件使用工具cbp2make
一.安装 Ubuntu 安装 :sudo apt-get install cbp2make 也可以源码安装. 二.生成makefile 这里要用到CodeBlocks的工程文件 .cbp cbp2ma ...
- Linux 用qmake快速生成makefile
1.简介: qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具.是qt工具包的一部分.在Unix&linux上写程式的人大概都碰过Makefile.用 ...
- linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)
linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...
最新文章
- 微信小程序 封装网络请求并调用
- 暂无,进程那篇深度不够
- Windows服务器上怎样开放指定端口
- Linux驱动编程 step-by-step (十) Linux 内核链表
- Ubuntu输入密码登陆后又跳回到登录界面
- 关于open***的实验总结
- cad2010多个文件并排显示_并排查看Excel工作表只需1个小动作,工作效率大涨百倍!...
- tensorflow之train.get_checkpoint_state
- jQuery,Table表头固定插件chromatable存在的问题及解决办法
- linux 修改ssh密码_西部数码使用指南:弹性云linux系统通过控制台进入单用户重置ssh登陆密码(适用centos6)...
- Python数据分析通关,30个案例!
- Unity 移动方法总结
- 如何使用ps制作ico图标文件
- ps修图教程新手入门:如何用Photoshop处理证件照
- Clarke Wight saving algorithm求解tsp问题
- OpenWrt的SR9000有线网卡驱动
- el-table表格横竖双表头,表头带斜线
- qq公众平台出错了609_中仑供应链业务线:一站式快消品订货平台
- git am, git apply, git format-patch,git diff 用法
- Android Activity的启动流程分析:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互