make及makefile学习

Makefile显示编译详情 在编译grpc的时候,发现编译不是静态编译,那么就会导致复制出去的时候程序会提示依赖glic版本依赖问题,而解决办法则是想办法找到编译时候的参数加上-static,但是makefile一大堆,想了两个方法,尝试了方法1即成功了,2后期再找找也就是要熟悉linux上进程的诊断。1.显示makefile编译过程详情,然后找到最后编译命令。使用了make VERBOSE=1来找,下列就是找的过程。2.使用tracee等工具,来找到编译命令,然后自己编。使用方法1来找,参考了下面链接。 阅读详情

1.make的使用语法

make [选项] [目标] [宏定义]

常用选项 特性
-d显示调试信息
-f<文件>

 制定从哪个文件中读取依赖关系信息。

默认文件是“Makefile”或“makefile”。

“-”表示从标准输入

-h 显示所有选项的简要说明
-n 不运行任何Makefile命令,只显示他们
-s 安静的方式运行,不现实任何信息

2.Makefile的编写原则和规则

(1)编写规规

  • 当make 命令不带选项运行时,它从Makefile中读取指定规则。
  • 当指定规则在不同于Makefile(或makefile)的其他文件中时,就要运行带有-f选项的make命令,比如make。fray。Makefile

(2)编写规则

1)规则一

目标列表:关联性列表

<TAB>命令列表

  • 目标列表:是用一个或多个空格分开的目标文件的清单。
  • 关联性列表(也称先觉条件):同样是一个或多个空格分开的目标文件,是目标列表所以来的多个目标文件的清单。
  • 命令列表:用于创建目标文件的将要执行的命令清单,这些命令被换行符隔开。命令列表中的每个命令必须以<Tab>字符开始。

2)规则二

目标列表:关联性列表;命令列表

  • 命令列表是一系列被分号隔开的命令。一个很长的命令行要续行时可以用反斜线符号。
  • 命令列表示例:

cd /home/momo/priv/bin;rm file1 file2\

lab2 lab3\

prog1.c prog2.c prog5.c


等同于

cd /home/momo/priv/bin;rm file1 file2 lab2 lab3 prog1.c prog2.c prog5.c
  • Makefile中可是哟个shell中的一些通配符:(1)注释(#)、连接符(\);(2)关联列表和命令列表中可使用shell通配符?、*等;

3.Makefile的示例

(1)示例一

#注释

    power:power.c

        gcc -o power power.c

(2)实例二

Makefile:

bin/mysum:obj/mymath.o obj/mysum.o
	gcc -o bin/mysum obj/mymath.o obj/mysum.o
obj/mymath.o:main/mymath.c
	gcc -o obj/mymath.o -Iinclude -c main/mymath.c
obj/mysum.o:func/mysum.c
	gcc -o obj/mysum.o -Iinclude -c func/mysum.c

clean:
	rm -f ojb/mymath.o obj/mysum.o

执行:

momo@anan:~/usr/dev/cc$ make clean
rm -f ojb/mymath.o obj/mysum.o
momo@anan:~/usr/dev/cc$ make (等价于make -f Makefile)
gcc -o obj/mysum.o -Iinclude -c func/mysum.c
gcc -o bin/mysum obj/mymath.o obj/mysum.o

4.Makefile变量的使用

(1)简单变量

  • 定义

    变量名:=[文本] 

这类变量的实质就是一组字符串

  • 添加

    变量名+=[文本]  等价于    变量名:=[文本] [文本]

 (2)引用变量

  • $(变量名)
  • $单字符变量

例如:

G:=gcc(注意等号两边不能有空格)

$G -o power power.c

(3)内置变量

  • make中有几个内置变量,使用这些变量会使我们的工作更简单。常用的内建(内置)变量和他们的意义:

 

    变量名        意义
    $@    当前目标的名称
    $?    比当前目标更新的已修改的依赖性列表
    $<        依赖性列表中的第一个文件
    $^

    用空格分开的所有依赖性列表

(4)虚目标

  • 不存在的我呢见,而且也无需创建他们;
  • 允许你强制执行某些事件,而这些事件在正常规则中是不会发生的;
  • 虚目标不是真正的文件,make命令可以使用针对他们的任意规则:

      虚目标总是使之与有关的命令被执行。

  • 常见的虚目标列表

    目标
    意义
    all
    生成工程中所有可以执行者,通常是makefile的第一个生成目标
    test
    运行程序的自动测试套件
    clean
    删除amke all生成的所有文件
    install
    在删除目录中安装工程项目生成的可执行文件和文档
    uninstall

    删除make install 安装的所有文件

  • 实例:
Makefile2
CC:=gcc
TARGET:=bin/mysum
OBJ:=obj/mymath.o obj/mysum.o
INCLUDE:=-Iinclude

$(TARGET):$(OBJ)
    $(CC) -o $@ $^
obj/mymath.o:main/mymath.c
    $(CC) -o $@ $(INCLUDE) -c $^
obj/mysum.o:func/mysum.c
    $(CC) -o $@ $(INCLUDE) -c $^

clean:
    rm -f $(OBJ)

执行:

momo@anan:~/usr/dev/cc$ make clean -f Makefile2
rm -f obj/mymath.o obj/mysum.o
momo@anan:~/usr/dev/cc$ make -f Makefile2
gcc -o obj/mymath.o -Iinclude -c main/mymath.c
gcc -o obj/mysum.o -Iinclude -c func/mysum.c
gcc -o bin/mysum obj/mymath.o obj/mysum.o

(5)特殊目标

make中有一些预定义的目标,这些预定义目标被make以一种特殊的方式进行处理,这些目标称为特殊目标。

    特殊目标
    目的
    .DEFAULTS
    如果make找不到生成目标的任何makefile入口或后缀规则,他就执行与目标相关的命令
    .IGNORE

    如果某一行makefile包含该目标,make忽略错误代码并继续建立,如果一个命令不正常存在,make自然会停止。

    带有-i选项的make命令可以执行相同的任务。

    .PHONY

    允许我们指定一个不是文件的目标,所以我们能指示make调用一系列makefile的命令,即使在我们当前目录有一个具有目

    标名称的文件

    .SILENT

    make执行这些命令但不现实这些命令,带有-s选项的make可以执行相同的任务。如前面所讨论的,在该命令前放置一个@

    符号就可以执行一个特别的命令(不显示到桌面上)

        .SUFFIXES
    为目标指定的前提(后缀)可以与后缀规则相关联。如果与目标没有相关联的前提,已存在的后缀列表就会被删除。
实例:
1)如果当前目录下有clean文件,我们再执行make clean就会出现提示:make: 'clean' is up to date.
momo@anan:~/usr/dev/cc$ ls -trl clean
-rw-rw-r-- 1 momo momo 9 5月   9 22:42 clean
momo@anan:~/usr/dev/cc$ cat clean
fjdlsjfl
momo@anan:~/usr/dev/cc$ make clean -f Makefile2
make: 'clean' is up to date.
解决:
在Makefile中增加特殊目标:.PHONY

如下makefile2:

CC:=gcc
TARGET:=bin/mysum
OBJ:=obj/mymath.o obj/mysum.o
INCLUDE:=-Iinclude

$(TARGET):$(OBJ)
	$(CC) -o $@ $^
obj/mymath.o:main/mymath.c
	$(CC) -o $@ $(INCLUDE) -c $^
obj/mysum.o:func/mysum.c
	$(CC) -o $@ $(INCLUDE) -c $^

.PHONY:clean

clean:
	rm -f $(OBJ)

执行:此时就可以解决之前的问题了

momo@anan:~/usr/dev/cc$ make clean -f Makefile2
rm -f obj/mymath.o obj/mysum.o

(6)默认模式规则

  • make中有许多预定义的指定规则也成为后缀规则,它可以让make自动执行许多任务。
  • make已经内建许多其他语言的规则和Unix使用程序(包括SCCS、RCS、ar、lex和yass)的规划。
  • 为了建立一个目标,make会遍历一连串的依赖关系,这是为了决定从何处开始建立(或重建)。如果没有找到目标文件,make就按照优先顺序查找源文件。
  • 为了生成目标文件,他首先查找带.c、.f或.s后缀的文件,如果一个都没找到,它会继续寻找带.c后缀的文件并继续搜索,直至找到一个源文件。如果没有找到一个源文件,make就会报告一个异常。
  • 默认的模式规则(GNU make)
%o:%c:
	$(CC) $(CFLAGS) -c $<
%o:%.s:
	$(AS) $(ASFLAGS) -o $@ $<

  • 默认的后缀规则
SUFFIXES:.o.c.s
.c.o:
	$(CC) $(CFLAGS) -c $<
.s.o:
	$(AS) $(ASFLAGS) -o $@ $<

实例:

Makefile2

CC:=gcc
TARGET:=bin/mysum
OBJ:=obj/mymath.o obj/mysum.o
INCLUDE:=-Iinclude


$(TARGET):$(OBJ)
	$(CC) -o $@ $^
obj/%.o:func/%.c
	$(CC) -o $@ $(INCLUDE) -c $^
#obj/mymath.o:func/mymath.c
#	$(CC) -o $@ $(INCLUDE) -c $^
#obj/mysum.o:func/mysum.c
#	$(CC) -o $@ $(INCLUDE) -c $^

.PHONY:clean

clean:
	rm -f $(OBJ)


保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南) 本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。 阅读详情

相关推荐

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 431

Makefile里面的$(MAKE)

make 定义了很多默认变量,${MAKE} 就是预设的 make 这个命令的名称(或者路径)。 make -p 可以查看所有预定义的变量的当前值。 ------------------------------------------我是分割线------------------------------------------ 有一个 make 的环境变量叫“MAKECMDGOALS”,

程序狗的成长之路 8705

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6694

makefile中的$(MAKE)的含义

$(MAKE) 在 Makefile 中表示 make 程序的名称。它可以用于在 make 进程中再次调用 make,以实现递归构建。

weixin_35749545的博客 2485

c++多线程(1)------创建和管理线程td::thread

std::thread 是 C++11 标准库中用于创建和管理线程的核心类,定义在 <thread> 头文件中。它使得多线程编程变得简单、类型安全且跨平台。

jndingxin的专栏 648

【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

这篇文章我们将继续实现曲线射击与两种不需要实体子弹的射击方式 源码在文章末尾。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5060

gcc编译到makefile到CMakeLists.txt编译详解

gcc编译到makefile到CMakeLists.txt编译详解 编译C/C++项目,我们一般是通过gcc来编译或者使用IDE来帮我们管理编译环境。 一般来说,使用gcc来编译会比使用IDE更加灵活,并且gcc有着广泛的环境支持,因此我们必须要掌握使用gcc来编译C/C++项目。 但是单纯使用gcc编译,当源文件数目少时还可以管理,当源文件数很多是,各种依赖会使得编译命令特别多,特别复杂,不易进行管理。 因此我们一般会通过GNU套件里提供的make工具,我们通过编写C/C++项目的makefile来帮我们

qq_41854911的博客 4243

华为od 面试八股文_C语言_02_含答案

华为od 面试八股文_C语言_02_含答案

MISAYAONE的博客 2230

Makefile中关于make的嵌套执行( $(MAKE) -C subdir )

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 4083

用 CL_HTTP_CLIENT 正确处理 Cookie,彻底解决 SAP Gateway OData 的 CSRF Token 校验失败

SAP OData 集成中 CSRF Token 校验失败的解决方案 问题现象:使用 Postman 测试 OData 写入成功,但 ABAP 代码调用时出现 CSRF token validation failed 错误。 根本原因:Postman 自动处理 Cookie,而 ABAP 代码仅获取了 CSRF Token 却遗漏了 Cookie 信息。SAP Gateway 要求修改请求必须同时携带 Token 和 Cookie 才能通过校验。 解决方案: 通过 GET 请求同时获取 CSRF Token

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 431

实战神器指标解析 篇四:主力吸筹指标及其分析和使用说明

主力可能会进行多次吸筹,因此需要根据黄色趋势线来判断是否有转强的变化。一旦出现转强的迹象,这通常意味着吸筹已经接近尾声,即将进入拉升前期。此时可以介入进行建仓。该股票指标通过分析价格变动的方式,能够精确跟踪并标识主力的吸筹行为。当底部出现多根洋红色柱子时,这通常表示出现了主力吸筹的指示。这段代码主要用于分析股票的底部吸筹情况、趋势和涨跌情况。

生活在别处 6219

嵌入式学习之Linux入门篇 make工具和makefile

在同一文件下使用make命令会去寻找相应的makefile文件。一.make和makefile的关系。

TheAnswerisy的博客 254

Android系统开发面试指南:系统Launcher岗位解析

本文针对上海礼聪Android系统开发岗位(侧重系统Launcher、充电/电池/USB底层开发)提供面试指南。内容涵盖应用开发(启动流程优化)、系统底层(充电状态机、USBOTG)、编程能力(线程安全LRU实现)、问题排查(ANR分析)及沟通协作等核心考点。通过5类典型问题及技术深度解析,帮助候选人系统准备,重点考察Framework源码理解、系统调试能力和工程思维。建议结合PowerManagerService等模块源码和systrace工具进行实践准备,同时注重技术表达与协作能力的展现。

郑伟强dev的专栏 934

编译 - Make 命令教程 以及Makefile - 学习/实践

主要用于学习和使用make命令进行软件编译安装。

"代码"的日常搬运 925

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

make和makefile入门学习记录

在makefile中还可以定义变量,于是在后面编译命令时就可以直接使用这个变量,而不用重复写。例如,我们使用CFLAG把一些编译选项定义成一个变量CFLAGS:-Wall -g -O2一般也会把目标文件、源文件、中间文件等也都定义为变量,如我们可以把上面的hello和world定义为targetsmain.c message.c定义为sourcesmain.o message.o定义为objects。

qq_73896708的博客 1581

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Linux学习之make Makefile

Makefile的基本使用

m0_61320035的博客 186

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Makefile学习之make 的运行

—————— 一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让 make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。 一、make的退出码 make命令执行后有三个退出码: 0 ——

suzilong11的专栏 1万+

学习《跟我一起学makefile》make 的运行

文章来源 一般来说,最简单的就是直接在命令行下输入make命令,make命令会找当前目录的makefile来执行,一切都是自动的。但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。本章节就是讲述如何使用make命令的。 1. make的退出码 make命令执行后有三个退出码: 0 表示成功执行。 1 如果make运行时出现任何错误,其返回1。 2 如果你使用了make的“-q”选项,并且make使得一些目标不需要更新,那么

Orange_Wu的博客 416

【makefile学习记录1】认识make和makefile

1、什么是make?为什么需要make?make本质是一个应用程序。用来解析源程序之间的依赖关系       很多源码程序的文件是非常多的,而且那些文件之间大多是有依赖关系的,make就是可以解析这些依赖的关系。根据依赖关系自动维护编译工作      因为在我们编译大型源码的时候,需要编译很多的程序,加入我们的程序在编译到一大半的时候,有一个程序报错停止编译了,那么我们就需要改错,然后重新make...

haibing_x的博客 248

深入学习Make命令和Makefile

一、都是源文件太多惹得祸 当我们在开发的程序中涉及众多源文件时,常常会引起一些问题。首先,如果程序只有两三个源文件,那么修改代码后直接重新编译全部源文件就行了,但是如果程序的源文件较多,这种简单的处理方式就有问题了。 设想一下,如果我们只修改了一个源文件,却要重新编译所有源文件,那么这显然是在浪费时间。其次,要是只重新编译那些受影响的文件的话,我们又该如何确定这些文件呢?比如我们使用了

边城水手的专栏 2121

GNU Make / Makefile 学习

在学习GNU Make / Makefile总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。 目录:一、GNU Make / Makefile 学习资料二、makefile入门基础1、make简介2、为什么要使用make3、makefile简介4、makefile的基本结构5、基础示例6、Makefile自动化变量7、make常用的内嵌函数 一...

Alliswell_WP 263

make与Makefile学习01

目录Linux make命令简介make例子: Linux make命令简介   Make是一种将源代码转换成可执行文件的自动化工具,通过Make语言,描述了源文件、中间文件、可执行文件之间的关系。与此同时,Make工具可以对编译过程进行优化,在重新编译时会根据时间戳来决定哪些文件需要重新生成,在编译大型工程时,这会省下不少时间。Make有多种变种,其中GNU Make使用相对广泛,在大多Linu...

E2MCC的博客 355

Makefile学习总结之执行Make

执行Make 最简单的方法:使用不带任何参数的“make”命令来重新编译所有过时的文件。 make的退出状态有三种: 0——状态为0,执行成功; 2——执行过程出现错误,同时会提示错误信息; 1——在执行make时使用了“-q”参数,而且当前工程中粗壮乃过时的目标文件 部分标准的伪目标和空目标命令: all——作为Makefile的顶层目标,一般此目标作为默认的终极目标; clean——这个伪目...

Good Good Study Day Day Up!!! 630

编译过程、gcc、make、Makefile学习总结

linux 编译过程 gcc make Makefile

zzx1012151040的博客 358

linux的make和makefile学习

L /home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib。假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式:  LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串)通常来讲, gcc默认会在程序当前目录、/lib、/usr/lib和/usr/local/lib下找对应的库。

weixin_42353399的博客 876

[RTOS 学习记录] 工程管理工具make及makefile

这篇文章是我阅读后的读书笔记,记录目的是为了个人后续回顾复习使用。

cedtek的博客 1156
上一篇: 静态库,动态库的创建与使用
下一篇: 数据结构之队列的学习程序实例
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值