automake的使用2
前言
如果你的入口文件main.c和依赖的文件不是在同一个目录中的,使用Autotools来管理项目的时候会稍微复杂一下。
在不同的目录下,项目会生成*.a文件的静态连接(静态连接相当于将多个.o目标文件合成一个)。main.c会通过静态连接方式来实现连接。
执行过程
源代码例子
这个例子中会加入libevent和pthread,让例子稍显复杂,这样可以详细的介绍不同目录下的Autotools的使用。
我们创建两个目录:
demo/ :放置helloworld.c主文件
src/ :放置output.c output.h 函数文件
demo中文件main.c:
#include "../src/output.h"
#include <stdio.h>
#include <string.h> int main(int argc,char * argv[])
{
int n=15;
printf("hello world %d \n",n);
int test = output("from helloword.c");
return 0;
}
output.h文件:
#ifndef _OUTPUT_H
#define _OUTPUT_H
int output(char* data);
#endif
output.c
#include <stdio.h>
#include <string.h>
int output(char* data)
{
printf("output data=%s\n",data);
return 0;
}
创建Makefile.am文件
在项目根目录下先创建Makefile.am文件
AUTOMAKE_OPTIONS=foreign
SUBDIRS = src demo
在demo/目录下创建Makefile.am文件
AUTOMAKE_OPTIONS = foreign
# AM_CPPFLAGS = -g -I$(top_srcdir)/src/ bin_PROGRAMS = helloworld
helloworld_SOURCES = helloworld.c
helloworld_LDADD = ../src/libsrc.a
在src/目录下创建Makefile.am文件
noinst_LIBRARIES = libsrc.a
libsrc_a_SOURCES = output.c
include_HEADERS = output.h
说明:src/目录下面不加include_HEADERS也是可以运行的,但是在使用make dist打包命令后,并不会将include/文件夹打包进去,所以还是需要加上include_HEADERS。
执行Autoscan命令
第一步,我们需要在我们的项目目录下执行autoscan命令。这个命令主要用于扫描工作目录,并且生成configure.scan文件。并且configure.scan需要重命令成configure.ac,然后编辑这个配置,我们才能继续执行后面的命令。
修改configure.ac文件,主要添加AC_PROG_RANLIB(生成静态库);AC_PROG_LIBTOOL (用来生成动态库)# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script. AC_PREREQ([2.69])
AC_INIT(helloworld, 2.0, ggao@micron.com)
AM_INIT_AUTOMAKE(helloworld, 2.0)
AC_CONFIG_SRCDIR(demo/helloworld.c)
AC_CONFIG_HEADERS([config.h]) # Generate static lib
AC_PROG_RANLIB ##注意添加 # Checks for programs.
AC_PROG_CC # Checks for libraries. # Checks for header files.
AC_CHECK_HEADERS([string.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile
demo/Makefile
src/Makefile])
AC_OUTPUT
执行 aclocal
运行 autoconf
运行 autoheader
手动添加必要的文件 NEWS,README,AUTHORS,ChangeLog
执行 automake --add-missing
执行 ./configure 生存 Makefile
====>>> 至此 Makefile 生成完毕。
如果要继续安装,
$ make
$ sudo make install 即可将可执行文件安装在 /usr/local/bin/ 目录下,以后就可以直接使用啦
$ sudo make uninstall 即可将安装的可执行文件从 /usr/local/bin 目录下移除
如果要发布你的软件,
- $ make dist 即可打包生成 xxx-version.tar.gz 文件
如果要清理中间文件,
make clean
make distclean
Autotools运行流程
流程总结:
执行autoscan命令。这个命令主要用于扫描工作目录,并且生成configure.scan文件。
修改configure.scan为configure.ac文件,并且修改配置内容。
执行aclocal命令。扫描 configure.ac 文件生成 aclocal.m4文件。
执行autoconf命令。这个命令将 configure.ac 文件中的宏展开,生成 configure 脚本。
执行autoheader命令。该命令生成 config.h.in 文件。
新增Makefile.am文件,修改配置内容
执行automake --add-missing命令。该命令生成 Makefile.in 文件。
执行 ./congigure命令。将Makefile.in命令生成Makefile文件。
执行make命令。生成可执行文件。
automake的使用2的更多相关文章
- 第4月第1天 makefile automake
1. gnu make的函数调用是$,比如 $(subst ee,EE,feet on the street) 规则中“TARGETS”可以是空格分开的多个文件名 a all: echo $(subs ...
- 利用 autoconf 和 automake 生成 Makefile 文件
一.相关概念的介绍 什么是 Makefile?怎么书写 Makefile?竟然有工具可以自动生成 Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚. 1.M ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- 手动安装m4, autoconf, automake, libtool
转自http://ruby-china.org/topics/2434 系列文章原载于自己的博客,TOPI.CO (http://topi.co) ,某天不小心就push错啦,懒得从头再来,上传到Ru ...
- unix automake 使用,快速生成你的Makefile
使用automake快速生成编译的Makefile 1,确保自己装有的软件automake autoconf 2, 1)执行autoscan 并将生成的configure.scan重命名为config ...
- Linux下使用automake、autoconf生成configure文件
一.生成configure过程中各文件之间的关系图 二.详细介绍 autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是con ...
- Linux下使用autoconf 和 automake 编译简单的HelloWorld
使用过开源C/C++项目的同学都知道,标准的编译过程已经变成简单的三部曲:./configure /make/make install,使用起来很方便,不像平时自己写代码,要手写一堆复杂的makefi ...
- emacs工程管理,cedet ede插件自动构建Make,Automake
鉴于自己一直都是在做客户端开发方面的工作,服务端很多知识都随着时间淡忘了,最近有一个计划,用一些时间补一下基础.所以早上很早就起床,花了一点时间大致浏览了一下BSD socket的相关API,然后用G ...
- Linux autoconf和automake使用
作为Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的Mak ...
随机推荐
- C#字符串Base64编解码
C#字符串Base64编解码 首先讲一下什么是Base64编码所谓Base64就是一种基于64个可打印字符来表示二进制数据的方法.Base64编码是从二进制到字符的过程,常用于在网络上传输不可见字符( ...
- [LeetCode]3.无重复字符的最长子串(Java)
原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...
- 痞子衡嵌入式:介绍i.MXRT定时器PIT的多通道链接模式及其在coremark测试工程里的应用
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT定时器PIT的多通道链接模式及其在coremark测试里的应用. 早在 2018 年 i.MXRT 系列跨界处理器刚推出的时 ...
- Linux性能优化概述
一.Linux性能概述 性能优化是个系统工程,总是牵一发而动全身,它涉及了从程序设计.编程语言,再到系统.存储.网络等各种底层基础设施的方方面面.每一个组件都有可能出问题,而且很有可能多个组件同时出问 ...
- java: 程序包com.sun.media.jai.codec不存在
Q:IDEA编译时提示"java: 程序包com.sun.media.jai.codec不存在" A:添加下面的repository到pom.xml中 <repository ...
- 『德不孤』Pytest框架 — 4、Pytest跳过测试用例
目录 1.无条件跳过skip 2.有条件跳过skipif 3.练习 自动化测试执行过程中,我们常常出现这种情况:因为功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了, 如果我们注释掉或删除掉这 ...
- Tableau退出已成定局,关键是用户如何“软着陆”
近期,BI界发生了一件大事,引起了大家的热议. 简单来说:Tableau停止在中国的原厂服务,把售后.解决方案等归到新加坡,在中国区域的运营将有阿里接管. 大部分业内人士认为中国区业务可能以出售.代理 ...
- 【C# 线程】数据槽 LocalDataStoreSlot简称DataSlot
背景 为了确保在线程中声明特定类型的变量,在每个线程中的值都是唯一的,不受到其他线程对该变量读写的影响.也就是俗称的线程本地存储 (TLS),可用于存储对线程和应用程序域唯一的数据. 例如:主线程中声 ...
- Windows三种文件系统:NTFS、FAT32、FAT16的区别
什么是文件系统? 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.也指用于存储文件的磁盘或分区,或文件系统种类. 举个通俗的比喻,一块硬盘就像一个块空地,文件就 ...
- 动态语言运行时(DLR)
前言 为了让C#.Visual Basic等.NET编程语言能具备动态编程语言的特性,.NET 4.0引入了一个"DLR(Dynamic Language Runtime:动态语言运行时)& ...