Makefile.am

一般格式

文件类型 书写格式
可执行文件 bin_PROGRAMES = foo
foo_SOURCES = xxxx.c
foo_LDADD =
foo_LDFLAGS =
foo_DEPENDENCIES =
静态库 lib_LIBRARIES = libfoo.a
foo_a_SOURCES =
foo_a_LDADD =
foo_a_LIBADD =
foo_a_LDFALGS =
头文件 include_HEADERS = foo.h
数据文件 data_DATA = data1 data2

对于可执行文件和静态库类型,如果只想编译,不想安装到系统中,可以用 noinst_PROGRAMS代替bin_PROGRAMS,noinst_LIBRARIES代替lib_LIBRARIES。

全局变量

Makefile.am还提供了一些全局变量供所有的目标体使用 :

变量 含义
INCLUDES 比如链接时所需要的头文件
LDADD 比如链接时所需要的库文件
LDFLAGS 比如链接时所需要的库文件选项标志
EXTRA_DIST 源程序和一些默认的文件将自动打入 .tar.gz 包,其他文件若要进入 .tar.gz 包可以使用这种方法,如配置文件,数据文件等。
SUBDIRS 处理本目录前要递归处理哪些子目录

automake 安装路径

automake设置了默认的安装路径:

标准安装路径

默认安装路径为 :
$(prefix) = /usr/local可以通过 ./configure --prefix=<new_path> 的方法来覆盖。其它的预定义目录还包括 :bindir = $(prefix)/bin,
libdir =  $(prefix)/lib,
datadir = $(prefix)/share,
sysconfdir = $(prefix)/etc等等。

定义一个新的安装路径

比如test, 可定义

testdir = $(prefix)/test,

然后 test_DATA =test1 test2,则 test1,test2 会作为数据文件安装到 $(prefix)/test 目录下。

示例

我们首先需要在工程顶层目录下创建一个 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

由于每个源文件都会用到相同的头文件,所以我们在最顶层的Makefile.am中包含 了编译源文件时所用到的头文件,并导出。

我们将 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

这里使用 noinst_LIBRARIES , 是因为如果只想编译,而不想安装到系统中,就 用 noinst_LIBRARIES 代替 bin_LIBRARIES ,对于可执行文件就用 noinst_PROGRAMS 代替 bin_PROGRAMS 。对于安装的情况,库将会安装到 $(prefix)/lib 目录下,可执行文件将会安装到 ${prefix}/bin 。如果想安装该 库,则 Makefile.am 示例如下:

bin_LIBRARIES=libswap.a
libswap_a_SOURCES=swap.c
INCLUDES=-I$(top_srcdir)/src/include
swapincludedir=$(includedir)/swap
swapinclude_HEADERS=$(top_srcdir)/src/include/swap.h

最后两行的意思是将 swap.h 安装到 ${prefix}/include/swap 目录下。

接下来,对于可执行文件类型的情况,我们将讨论如何写 Makefile.am . 对于编 译apple/core目录下的文件,我们写成的Makefile.am如下所示:

noinst_PROGRAMS=test
test_SOURCES=test.c
test_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o $(top_srcdir)/src/lib/libswap.a
test_LDFLAGS=-D_GNU_SOURCE
DEFS+=-D_GNU_SOURCE
#LIBS=-lpthread

由于我们的 test.c 文件在链接时,需要 apple.o 和 libswap.a 文件,所以我 们需要在 test_LDADD 中包含这两个文件。对于 Linux 下的信号量/读写锁文件 进行编译,需要在编译选项中指明 -D_GNU_SOURCE 。所以在 test_LDFLAGS 中指 明。而 test_LDFLAGS 只是链接时的选项,编译时同样需要指明该选项,所以需 要 DEFS 来指明编译选项,由于 DEFS 已经有初始值,所以这里用 += 的形式指 明。从这里可以看出,Makefile.am 中的语法与 Makefile 的语法一致,也可以 采用条件表达式。如果你的程序还包含其他的库,除了用 AC_CHECK_LIB 宏来指 明外,还可以用LIBS来指明。

如果你只想编译某一个文件,那么 Makefile.am 如何写呢?这个文件也很简单, 写法跟可执行文件的差不多,如下例所示:

noinst_PROGRAMS=apple
apple_SOURCES=apple.c
DEFS+=-D_GNU_SOURCE

我们这里只是欺骗 automake ,假装要生成apple文件,让它为我们生成依赖关系 和执行命令。所以当你运行完 automake 命令后,然后修改 apple/shell/ 下的 Makefile.in 文件,直接将LINK语句删除,即:

clean-noinstPROGRAMS:-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)apple$(EXEEXT): $(apple_OBJECTS) $(apple_DEPENDENCIES)@rm -f apple$(EXEEXT)#$(LINK) $(apple_LDFLAGS) $(apple_OBJECTS) $(apple_LDADD) $(LIBS)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LSGO软件技术团队2015~2016学年第七周(1012~1018)总结

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

Oralce 9.2.0.6 到 9.2.0.8 升级 小结

13号&#xff0c;晚上加班&#xff0c;将2台数据库从9.2.0.6 升级到9.2.0.8. 因为之前有个小bug&#xff0c;9.2.0.6 的DataGuard中会经常不能识别备库的监听&#xff0c;造成Data Guard不能同步。 Oracle 的升级包&#xff0c;path什么的&#xff0c;需要从metalink上下载&…

idea查询类_Spring Security入门(三): 基于自定义数据库查询的认证实战

0 引言在笔者的上一篇文章中Spring Security入门(二)&#xff1a;基于内存的认证一文中有提到过Spring Security实现自定义数据库查询需要你实现UserDetailsService接口&#xff0c;并实现loadUserByUsername(String username)抽象方法。我们可以在UserDetailsService接口的实现…

vxworks点滴记录

MPC852---大端模式 对于vxWork5.5来说&#xff1a; vxWorks操作系统是一个进程&#xff0c;其间的所有任务是该进程内的线程&#xff0c;因为他们有统一的地址空间。没有main函数。。 对于vxWorks6来说&#xff1a; 你可选支持多个进程&#xff0c;每个进程由独立的地址空间&…

第4章操作系统基础第五版Aimin.rar

第4章操作系统基础第五版Aimin.rar转载于:https://www.cnblogs.com/emanlee/archive/2010/10/14/1851101.html

python计算小数点后有几位_python的数字类型

python的数字类型分为三种&#xff0c;分别是整数int、 浮点数float 和 复数complex。数字是由数字字面值或内置函数与运算符的结果来创建的&#xff0c; 不带修饰的整数字面值会生成整数。包含小数点或幂运算符的数字字面值会生成浮点数。在数字字面值末尾加上 j 或 J 会生成虚…

c# 判断点是否在区域内 点在区域内 在多边形内 判断

方法一 算法 &#xff1a; public int isLeft(Point P0, Point P1,Point P2) { int abc ((P1.X - P0.X) * (P2.Y - P0.Y) - (P2.X - P0.X) * (P1.Y - P0.Y)); return abc; } private bool PointInFences(Point pnt1, Point[] fencePnts) { int wn 0,j…

Window服务的创建与删除

Windows服务应用程序是一种需要长期运行的应用程序&#xff0c;它对于服务器环境特别适合。它没有用户界面&#xff0c;并且也不会产生任何可视输出。任何用户消息都会被写进Windows事件日志。计算机启动时&#xff0c;服务会自动开始运行。它们不要用户一定登录才运行&#xf…

python颜色识别_颜色检测python

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https:blog.csdn.netu0121626…

涵盖各种编程语言的深度学习库整理大全!

Python 1. Theano是一个python类库&#xff0c;用数组向量来定义和计算数学表达式。它使得在Python环境下编写深度学习算法变得简单。在它基础之上还搭建了许多类库。 1.Keras是一个简洁、高度模块化的神经网络库&#xff0c;它的设计参考了Torch&#xff0c;用Python语言编写&…

epoll机制

在linux的网络编程中&#xff0c;很长的时间都在使用select来做事件触发。在linux新的内核中&#xff0c;有了一种替换它的机制&#xff0c;就是epoll。相比于select&#xff0c;epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中&#xf…

LSGO软件技术团队与信息1402班开展真人CS活动

LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为数据分析与计算机视觉。成立几年来为学校培养了一批优秀学生&a…

a标签去掉下划线_解决 v-html 元素中标签样式失效 - Vue

最近在做一个项目&#xff0c;是对富文本编辑器生成的 HTML 渲染到页面中&#xff0c;大家都会想到当然是用 Vue 的 v-html 属性&#xff0c;于是我写下了这样的代码<template><div class"content-html" v-html"article.contentHtml" /> </…

判断 Java 中的空字符串

原文地址&#xff1a;http://www.neoease.com/string-is-empty/ 以下是 Java 判断字符串是否为空的三种方法.方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低.方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法.方法三: Java SE 6.0 才开始提供的方法, 效率和方法…

Socket的send函数在执行时报EAGAIN的错误

Socket的send函数在执行时报EAGAIN的错误] 内容提要: 当客户通过Socket提供的send函数发送大的数据包时&#xff0c;就可能返回一个EGGAIN的错误。该错误产生的原因是由于send 函数中的size变量大小超过了tcp_sendspace的值。tcp_sendspace定义了应用在调用send之前能够在k…

写让别人能读懂的代码

随着软件行业的不断发展&#xff0c;历史遗留的程序越来越多&#xff0c;代码的维护成本越来越大&#xff0c;甚至大于开发成本。而新功能的开发又常常依赖于旧代码&#xff0c;阅读旧代码所花费的时间几乎要大于写新功能的代码。 我前几天看了一本书&#xff0c;书中有这么一句…

python中什么是按位取反_Python学习中的“按位取反”笔记总结

|疑惑 最近在学习Python的过程中了解到位运算符&#xff0c;但对于按位取反有点迷糊&#xff0c;就比如说~9&#xff08;按位取反&#xff09;之后的结果是-10&#xff0c;为什么不是6呢&#xff1f;所以下面就来看看为什么不是6&#xff0c;正确结果是如何计算出来的呢&#x…

非阻IO与EWOULDBLOCK EAGAIN

非阻塞读写 默认 socket 是阻塞的&#xff0c;读写函数 read, readv, recv, recvfrom, recvmsg 以及 write, writev, send, sendto, sendmsg 都有可能会阻塞。可以将 socket 描述字设为非阻塞&#xff0c;这样&#xff0c;当 socket 描述字未就绪时&#xff0c;调用以上读写函…

一起学windows phone7开发(二十一.二 Map控件的简单使用)

1. 注册地图&#xff1a; 在使用地图之前必须先申请register key https://www.bingmapsportal.com/ 将申请到的key填到这个属性&#xff0c;地图才可以正常使用。 CredentialsProvider 属性&#xff1a;填写申请到的Register key。 2.设置中心点&#xff1a; <my:Map Height…

UML类图五种关系与代码的对应关系

UML类图中的五种关系的耦合强弱比较&#xff1a;依赖<关联<聚合<组合<继承 一、依赖关系&#xff1a; &#xff08;一&#xff09;说明 虚线箭头 可描述为&#xff1a;Uses a 依赖是类的五种关系中耦合最小的一种关系。 因为在生成代码的时候&#xff0c;这两个关系…