当前位置: 首页 > news >正文

C、C++项目中 configure、makefile.am、makefile.in、makefile 之间的关系

一、configure、makefile.am、makefile.in、makefile 之间的关系

这四个文件都是与 GNU Make(一个用于管理程序的编译和安装过程的工具)有关的文件,它们的关系如下:

  1. configure:是一个脚本文件,用于根据系统环境生成 makefile 文件,其中包含了一些变量和选项,以配置要编译的程序。configure 脚本会根据用户的选择生成 makefile.in 文件。

  2. makefile.am:是一个 Makefile 的模板文件,包含了程序需要的各种源文件、库链接、编译选项、安装目录等信息,但是这个文件还不能直接使用,需要通过 automake 工具来生成 makefile.in 文件。

  3. makefile.in:是一个可根据具体用户平台生成 makefile 的模板文件,其中包含了 configure 脚本中定义的变量和选项信息,以及 makefile.am 文件中定义的源文件、库链接、编译选项、安装目录等信息。

  4. makefile:是最终生成的 Makefile 文件,是根据 makefile.in 文件生成的,其中包含了编译、链接、安装等操作的规则和具体的指令信息。最终通过 make 命令执行该文件,完成程序的编译、链接和安装。

二、示例

假设我们有以下简单的 C 语言程序,包含两个源文件 hello.cworld.c,并需要链接 libm 库:

// hello.c
#include <stdio.h>int main() {printf("Hello ");return 0;
}// world.c
#include <stdio.h>
#include <math.h>int main() {printf("World! sin(2.0)=%f\n", sin(2.0));return 0;
}

针对这个程序,我们需要编写一个 Makefile 文件实现以下功能:

  1. 编译 hello.cworld.c 为可执行文件 helloworld
  2. 链接 helloworld 以生成可执行文件 hello_world
  3. 安装可执行文件 hello_world

下面是一个简单的示例 Makefile.am 文件:

# Makefile.ambin_PROGRAMS = hello_worldhello_world_SOURCES = hello.c world.c
hello_world_LDADD = -lm

上述 Makefile 文件使用 Automake 工具生成具有类似以下内容的 Makefile.in 文件:

# Makefile.in# variables
bindir = /usr/local/bin# targets
hello_world_SOURCES = hello.c world.c
hello_world_LDADD = -lm
bin_PROGRAMS = hello_world# rules
all: hello_worldhello_world: hello.o world.o$(LINK) $(hello_world_LDFLAGS) -o $@ $^ $(hello_world_LDADD)%.o: %.c$(COMPILE) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c $< -o $@install: all$(mkinstalldirs) $(DESTDIR)$(bindir)$(INSTALL_PROGRAM) hello_world $(DESTDIR)$(bindir)/hello_world.PHONY: clean
clean:rm -f *.o hello_world

最终,我们可以通过以下命令生成 Makefile、编译和安装可执行文件:

# 生成 Makefile
$ ./configure# 编译和链接
$ make# 安装
$ sudo make install
http://www.lryc.cn/news/123930.html

相关文章:

  • 【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)
  • 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
  • ArcGIS Maps SDK for JavaScript系列之一:在Vue3中加载ArcGIS地图
  • 服务器扩展未生效
  • Jenkins构建自由风格项目发布jar到服务器
  • Rabbitmq延迟消息
  • miniExcel 生成excel
  • Handler详解
  • Feign忽略Https的SSL最佳方案(且保证负载均衡将失效)
  • Neo4j之SET基础
  • Redis 缓存过期及删除
  • 万字长文·通俗易懂·一篇包掌握——输入/输出·文件操作(c语言超详细系列)(二)
  • 【左神算法刷题班】第17节:在有序二维数组中查找目标值、等于目标字符串的子序列个数
  • 【Terraform学习】本地变量(Terraform配置语言学习)
  • zabbix自动注册服务器以及部署代理服务器
  • 掌握Python的X篇_32_使用python编辑pdf文件_pdfrw
  • 【软件工程】软件测试
  • Android性能优化——内存优化
  • Android Studio实现图形验证码
  • JAVA面试数据库篇
  • Android高手进阶教程(三)之----Android 中自定义View的应用.
  • 第一百一十三回 dart中的getter/setter方法
  • 搭建Docker环境
  • 微服务08-多级缓存
  • Intel汇编和ATT汇编的区别?
  • MongoDB 备份与恢复
  • 探讨uniapp的网络通信问题
  • 【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题
  • 网络安全体系架构介绍
  • JSP实训项目设计报告—MVC简易购物商城