make,makefile,make install,make clean,cmake,gcc(转)

2023-11-13

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4.所以出现了make工具

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

5.makefile是什么?简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。

6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

8.这时候就出现了Cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

9.可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

10.到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

简单概括

简单来说,make仅编译;make install编译并安装;make clean删除临时文件

inux编译安装中configure、make和make install各自的作用

  • ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
  • make是用来编译的,它从Makefile中读取指令,然后编译。
  • make install 从Makefile中读取指令install代表的指令,执行安装。

详细说明

1、configure

这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure --prefix=/usr上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin.同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 --with、--enable、--without、--disable 等等参数对编译加以控制,你可以通过允许 ./configure --help 察看详细的说明帮助。

2、make

这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或Python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。
make 是 Linux 开发套件里面自动化编译的一个控制程序,他通过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些需要的程序进行编译的程序。一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。

3、make install 和make uninstall

从Makefile中读取指令install代表的指令,执行安装,例如makefile 中设定的install是:

 …… 
install:    
   install -d $(bindir)     
   install -m 0755 hello  $(bindir) ……
 

make install 就是去执行下面两条命令

    install -d $(bindir)
    install -m 0755 hello  $(bindir)

这里的install 是linux系统命令,用法自己去查。

make install 这条命令来进行安装(当然有些软件需要先运行 make check 或 make test来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)

make uninstall 同理

  uninstall:      
     rm $(bindir)/hello

扩展说明

makefile 中支持这四个命令:make,make install ,make clean和make uninstall_sxf_0123的博客-CSDN博客_makefile中install

利用configure所产生的Makefile文件有几个预设的目标 动作 可供使用:

  make all:编译Makefile中all设定的目标,即此范例中的可执行文件。只打make 默认就是make all,只编译其中某个目标则在后面给目标名称:make ceph-common。

例如:Makefile如下

.PHONY: image flashcard put-files
put-files:
    @echo "=== put-files"
image:
    @echo "=== image"
flashcard:
    @echo "=== flashcard"
all: put-files image flashcard
    @echo "Done"
 

make put-files 就是只编译put-files 这个目标,make all 就是编译 put-files、 image、 flashcard

  make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。

  make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。

  make install:把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。

  make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据http://configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。

  make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境的人去重新编译。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

make,makefile,make install,make clean,cmake,gcc(转) 的相关文章

  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 应用程序中两个不同版本的库

    考虑一个场景 其中有两个不同版本的共享库 考虑 A 1 so 链接到 B so A 2 so 链接到 C so 现在 B so 和 C so 都链接到 d exe 当 B so 想要调用 A 1 so 中的函数时 它最终会调用 A 2 so
  • 如何将一个文本文件拆分为多个 *.txt 文件?

    我有一个文本文件file txt 12 MB 包含 something1 something2 something3 something4 有没有办法分开file txt分成 12 个 txt 文件 比方说file2 txt file3 t
  • Linux中如何避免sleep调用因信号而中断?

    我在 Linux 中使用实时信号来通知串行端口中新数据的到达 不幸的是 这会导致睡眠呼叫在有信号时被中断 有人知道避免这种行为的方法吗 我尝试使用常规信号 SIGUSR1 但我不断得到相同的行为 来自 nanosleep 联机帮助页 nan
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 如何获取与 shell 中的文件名模式匹配的所有文件的总文件大小?

    我正在尝试仅使用 shell 来计算与文件名模式匹配的所有文件 在目录树中 的总大小 以字节为单位 这是我到目前为止所拥有的 find name undo exec stat c s awk 总计 1 END 打印总计 有没有更简单的方法来
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • 在 Linux 中重新启动时,新创建的文件变为 0 kb(数据被覆盖为空)

    我遇到了一个奇怪的问题 这让我发疯 当前的任务是在 root 用户第一次登录时启动一组文件 并在同一用户第二次登录时启动另一组文件 我决定使用 profile 和 bashrc 文件 并在第一次登录期间发生的任务结束时重新加载 bashrc
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考

随机推荐

  • Pinia的使用方法

    Pinia的作用 作用 Pinia 是 Vue js 的轻量级状态管理库 他可以在组件和页面间共享状态 相关链接 官方网站 https pinia vuejs org 中文文档 https pinia web3doc top introdu
  • Linux驱动(一)之最简单的驱动程序

    1 前言 为什么要有驱动 为了防止像我等小菜程序员写应用程序的时候权限过高直接去操作底层设备 给设备造成不可挽回的损失 所以要过度一下 让大牛们将底层封装好 应用开发工程师只需要通过特定的接口来完成特定的功能就可以了 2 应用 通常情况下
  • Web入门梳理:HTML5

    html5 2008年 HTML5 HTML的新版本 新标准 常用新标签 相关内容可查看 W3C手册 header 文档页面头部 nav 导航链接部分 footer 文档页脚 底部 article 文章 section 章节 区段 asid
  • [从零开始学习FPGA编程-40]:进阶篇 - 设计-竞争与风险Risk或冒险

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 前言 第1章 什么是竞争与风险 1 1 数字电路的竞争与分风险概述 lt
  • jupyter notebook-如何产生动图(生成模型的利器)

    问题描述 当我们在训练生成模型时 如何方便的观察生成图像的质量 毫无疑问动态是最好的效果 IPython中的display模块 Ipython中的display模块可以很好的控制jupyter notebook中每个cell的输出 我们通过
  • 静态方法 和静态变量——Java

    什么是静态方法 也叫类方法 当一个方法前有static时此方法就是一个静态方法 静态方法可以直接通过类名调用 类变量和类方法 类变量 也叫静态变量 由static修饰的变量 也叫静态属性 可以被所有的类对象实例共享 也叫相当于说 一个类创建
  • springboot+mybatisplus+druid配置mysql与clickhouse多数据源配置

    springboot mybatisplus druid配置mysql与clickhouse多数据源配置 1 导入jar包
  • 常见升降压电源原理

    文章目录 一 开关降压电路 buck 二 开关升压电路 boost 三 线性降压电路 一 开关降压电路 buck 电路图 开关闭合时 电源给电感和电容充电 开关断开时 电感作为电源给负载供电 工作时的电压变化 二 开关升压电路 boost
  • 微信小程序框架

    框架 小程序开发框架的目标是通过尽可能简单 高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务 整个小程序框架系统分为两部分 逻辑层 App Service 和 视图层 View 小程序提供了自己的视图层描述语言 WXML 和
  • SAP ABAP 数据填充进EXCEL模板或代码生成EXCEL并维护数据下载到本地

    文章目录 需求 一 针对有EXCEL模板只填充数据的情况 二 没有模板需要凭空生成Excel的情况 如果需要把大量数据整理后转化为excel传向OA 三 检查Excel是否正确安装 四 如果系统中没有ZCL EXCEL 的帮助类 总结 需求
  • jackson的jar包下载

    没必要去csdn的下载频道去付付费下载 这里有最全最新的Jackson的jar包资源 点我即可 评论有朋友说链接失效了 因为现在工作内容与java无关 不知道地址正确与否 但各位仍可一试 更新后的链接
  • Selenium快速入门

    目录 一 Selenium简介 二 Selenium组成 三 Selenium特点 四 Selenium使用 导入pom依赖 下载浏览器驱动 创建一个测试类 获取网页数据 1 Class选择 driver findElement By cl
  • Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆 但是 基本上都是一知半解 包括我 为什么呢 我在尝试分别在两个平台加密的时候 竟然发现Android DES 加密和java DES加密的程序不能互通 就是加密的结果不一样 更不要说Android平台的加密输入作为
  • JAVA内存模型与JVM内存模型的区别

    JAVA内存模型与JVM内存模型的区别 直接进入正题 JAVA内存模型 Java内存模型规定所有的变量都是存在主存中 每个线程都有自己的工作内存 线程堆变量的操作都必须在工作内存进行 不能直接堆主存进行操作 并且每个线程不能访问其他线程的工
  • 计算机网络(互联网组成、计算机通信方式、电路、报文、分组交换、主要性能指标)

    互联网的组成 边缘部分 由主机组成 这部分是用户直接使用的 核心部分 由网络和路由器组成 边缘部分 计算机之间通信 主机A和主机B进行通信 实际上是指 主机A的某个进程和主机B上的另一个进程进行通信 或简称为 计算机之间通信 计算机的进程
  • Python数据库操作手册

    数据库的操作在现在的Python里面已经变得十分的好用 有了一套API标准 下面的就是讲讲如何的去使用这套框架定义 此框架包含以下部分 模块接口 连接对象 游标对象 DBI辅助对象 数据类型与定义 如何实现的提示 从1 0到2 0的变化 例
  • APP上架需要的准备和流程

    一 上架iOS应用市场前的准备 1 选择适合自己的苹果开发者账号 1 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang 单人使用 个人账号只能有一个开发者
  • 一篇学会Swagger2(集成knife4j)

    目录 一 Swagger2简介 1 前言 2 Open API是什么 3 Swagger简介 3 1 特性 3 2 组件 二 knife4j 三 内容 3 1 依赖 3 2 配置类 3 3 Controller层添加注解 3 4 测试 sw
  • Apache Tomcat如何高并发处理请求

    介绍 作为常用的http协议服务器 tomcat应用非常广泛 tomcat也是遵循Servelt协议的 Servelt协议可以让服务器与真实服务逻辑代码进行解耦 各自只需要关注Servlet协议即可 对于tomcat是如何作为一个高性能的服
  • make,makefile,make install,make clean,cmake,gcc(转)

    1 gcc是GNU Compiler Collection 就是GNU编译器套件 也可以简单认为是编译器 它可以编译很多种编程语言 括C C Objective C Fortran Java等等 2 当你的程序只有一个源文件时 直接就可以用