makefile

Makefile命令参数、调用其他Makefile、嵌套 介绍make运行参数和调用其他makefile 阅读详情
  • -makefile里面以“-”开头的指令,执行到的时候如果发生错误,不中断make的执行
    @开头的指令,在执行到的时候不回显命令的内容,只显示命令的输出

  • 修改了几个源文件,重新make时就只重新编译这几个文件

  • 如果修改了头文件,如果Makefile里面没有在 .o 文件的依赖后面写出依赖的 .h 文件那么你改了这个 .h 文件,不make clean,直接make,.h 文件里面的改动是不会生效的

  • 本质:文件依赖

  • 源文件经过编译成为中间代码文件( .o)----->检测语法、函数变量的声明是否正确。
    中间代码文件经过链接成为可执行文件。----->链接函数、全局变量。

  • 反斜杠:行连接符,后面必须紧跟回车换行,才能成功连接下一行。

  • makefile 里面的注释符:#,若要使用 # 号本身,则用 \#

  • 隐晦规则 / 自动推导:
    例如,

原版

objects = main.o kbd.o command.o display.o \ 
insert.o search.o files.o utils.o 
edit : $(objects) 
	cc -o edit $(objects)   ////这里的目标文件一定不能省略!!!
main.o : main.c defs.h 
	cc -c main.c 
kbd.o : kbd.c defs.h command.h 
	cc -c kbd.c 
command.o : command.c defs.h command.h 
	cc -c command.c 
display.o : display.c defs.h buffer.h 
	cc -c display.c 
insert.o : insert.c defs.h buffer.h 
	cc -c insert.c 
search.o : search.c defs.h buffer.h 
	cc -c search.c 
files.o : files.c defs.h buffer.h command.h 
	cc -c files.c 
utils.o : utils.c defs.h  
	cc -c utils.c 
clean : 
	rm edit $(objects) 
	

自动推导版

objects = main.o kbd.o command.o display.o \  
insert.o search.o files.o utils.o 
edit : $(objects) 
	cc -o edit $(objects)   //这里的目标文件一定不能省略!!!
main.o : defs.h 
kbd.o : defs.h command.h 
command.o : defs.h command.h 
display.o : defs.h buffer.h 
insert.o : defs.h buffer.h 
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h 
utils.o : defs.h 
.PHONY : clean 
clean : 
	rm edit $(objects) 
  • 可以在上面 code 最后一行前面加上一个小减号,变成 -rm edit $(objects)
    意思是:也许文件会出现问题,但不要管,继续做后面的事。
  • 在 Makefile 使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的 #include,被包含的文件会原模原样的放在当前文件的包含位置。include 的语法是: include 。注意这里就不要加 # 号了。filename 可以是当前操作系统 Shell 的文件模式(可以保含路径和通配符) 在 include 前面可以有一些空字符,但是绝不能是[Tab]键开始。 有这样几个 Makefile:a.mk、b.mk、c.mk,还有一个文件叫 foo.make,以及一个变量$(bar),其包含了 e.mk 和 f.mk,那么,下面的语句: include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk
  • command 是命令行,如果其不与“target:prerequisites”在一行,那么,必须以[Tab 键]开头,如果和 prerequisites 在一行,那么可以用分号做为分隔。
    targets : prerequisites ; command
    或者
    targets : prerequisites
    ----Tab----command
  • make 支持 三各通配符:“ * ”,“ ? ”和“ [ … ] ”。“ *. c ”表示所有后缀为 c 的文件。
    如果我们的文件名中有通配符,如:“ * ”,那么可以用转义字符 “ \ ”,如“ \* ” 来表示真实的 “ * ” 字符。
    通配符同样可以用在变量中。并不是说 [ * . o ] 会展开,不 !objects 的值就是 “ * . o ” 。
  • VPATH 与 CFLAGS
    VPATH----->变量,定义你要包含的源文件路径
    vpath----->关键字,
    vpath < pattern > < directories > ------>为符合模式 < pattern > 的文件指定搜索目录 < directories >。
    vpath < pattern > ------> 清除符合模式 < pattern > 的文件的搜索目录。
    vpath ------> 清除所有已被设置好了的文件搜索目录。
  • makefile 如果用 - rm来删除指定的文件,文件如果没有,会报错。
objects = test.o add.o
CFLAGS = -I ../
vpath add.h ../
main:test.o add.o
 @cc -o  main $(objects)
test.o:test.c add.h
 @cc $(CFLAGS) -c test.c
add.o:add.c add.h
 @cc $(CFLAGS) -c add.c
.PHONY:cleanall cleanobj cleanout
cleanall:cleanobj cleanout
cleanobj:
 @-rm *.o
cleanout:
 @-rm main
  • 使用一个自 动化变量“ $ @ ”,这个变量表示着目前规则中所有的目标的集合。
  • - $ ( subst output , $ @ ) 中的 “ $ ” 表示执行一个 Makefile 的函数,函数名为 subst, 后面的为参数。
  • Makefile 在编译别的目录的源文件时。gcc 不会使用诸如 VPATH、vpath这些变量或者关键字,所以若 . c 文件不在当前目录下,要把它指定在gcc -c src.c 这一行中。
objects = test.o add.o happy.o hello.o
CFLAGS = -I ../
VPATH =  ../
main:test.o add.o happy.o hello.o
 @gcc -o main test.o add.o hello.o happy.o
test.o:test.c add.h happy.h hello.h
 @gcc $(CFLAGS) -c test.c
add.o:add.c add.h
 @gcc $(CFLAGS) -c add.c
happy.o:happy.c happy.h
 @gcc $(CFLAGS) -c ../happy.c   #gcc会直接寻找happy.c,不会使用VPATH 或者 vpath,所以要在此处指明位置
hello.o:hello.c hello.h
 @gcc $(CFLAGS) -c hello.c
.PHONY:clean
clean:
 @rm main $(objects)
  • VPATH 中路径使用 :分隔;
    而 CFLAGS 使用 空格 分隔;
    vpath 一个路径一行,格式见上。
  • gcc -M src.c 查看源文件所有包含的头文件,包括一些没在 . c 显示出来;
    gcc -MM src.c查看源文件,只显示在 . c 中显示出来的。
  • set -e
    set命令的-e参数,linux自带的说明如下:
    “Exit immediately if a simple command exits with a non-zero status.”
    也就是说,在"set -e"之后出现的代码,一旦出现了返回值非零,整个脚本就会立即退出。有的人喜欢使用这个参数,是出于保证代码安全性的考虑。但有的时候,这种美好的初衷,也会导致严重的问题。
  • rm -f 即使文件不存在的也不会报错。
    rm -r 级联删除,可以删除目录以及目录下的文件。
【makefile】顶层Makefile向下层Makefile传递参数 阅读详情

相关推荐

Arduino MLX90393磁力计驱动库:高精度三轴霍尔传感器开发指南

三轴霍尔效应磁力计是嵌入式系统中实现无接触角度检测、电子罗盘与电流传感的核心器件。其工作原理基于霍尔电压随外磁场矢量变化的物理特性,通过I²C接口输出高分辨率(16/20-bit)XYZ轴原始数据,并集成温度补偿与数字滤波功能。技术价值体现在确定性响应、低功耗(典型0.5 μA待机)及强抗干扰能力,适用于电池供电设备与实时操作系统环境。典型应用场景包括电机位置反馈、永磁体旋转角度解算、工业编码器和地磁导航。本库专为Arduino生态优化,深度封装MLX90393寄存器协议与自校准流程,同时兼容STM32、E

weixin_29363791的博客 640

Makefile 介绍

Make 概述、Makefile 介绍

月半 月半的博客 1507

别再只会插卡了!用示波器实测SIM卡上电时序与通信波形(附故障排查)

本文深入解析了SIM卡通信的电气信号与时序规则,通过示波器实测波形揭示SIM卡上电时序与通信协议的关键细节。从VCC、CLK、RST、DATA四路信号的协同工作,到ATR(Answer to Reset)的解析,再到常见故障的波形诊断与排查方法,为硬件工程师提供了实用的调试指南。文章还分享了高级调试技巧与现代化工具链搭建建议,帮助提升物联网设备SIM卡通信的可靠性与效率。

weixin_42567279的博客 325

对Makefile中的换行、缩进进行高效调试的窍门 cat debug

可以使用 cat -v -t -e 把tabs用^I的形式输出,把换行符用$的形式输出 注意:在vscode的默认设置中,会把tab用两个空格代替,需要在右下角进行切换 另外,Makefile只支持tabs,不支持用空格代替tabs 来源:https://stackoverflow.com/questions/16931770/makefile4-missing-separator-stop ...

shimly123456的博客 272

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6646

【YOLO26实战全攻略】09——YOLO26多目标跟踪实战宝典:从原理到智慧园区人流统计全流程

多目标跟踪(MOT)是视频分析的核心技术,解决了单帧检测无法关联目标身份的痛点。本文基于YOLO26轻量化检测模型与ByteTrack跟踪算法,从新手视角出发,系统讲解多目标跟踪的核心原理、环境搭建、实操步骤与工程落地。内容涵盖ByteTrack分层关联策略解析、YOLO26集成跟踪的一行代码实现、配置参数调优、区域计数、轨迹数据提取与热力图可视化,最终通过智慧园区人车流量统计虚拟案例,完整呈现从技术原理到实际应用的全流程。本文注重实用价值,所有代码可直接复现,参数配置附带场景化建议,帮助新手快速上手。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 353

makefile中使用通配符和换行符

makefile中使用通配符和换行符

sulongvc的专栏 1万+

RK3399外设驱动之MIPI

RK3399外设驱动之MIPI 文章目录RK3399外设驱动之MIPIMIPI命令解析入口代码mipi显示配置实例rk3399mipi驱动rk mipi驱动注册过程rk32_mipi_dsi.c解析 内核版本 Linux4.4 平台 rk3399 作者 nineyole MIPI命令解析入口代码 MIPI的入口代码如下:kernel\drivers\video\rockchip\screen\lcd_mipi.c static int __init rk_mipi_screen_in

学无止境 2227

30天自制操作系统 pdf_day02——汇编语言和Makefile入门【专栏】30天自制操作系统...

【专栏】30天自制操作系统系列——目录白羽:day00——前言&&目录【专栏】30天自制操作系统1.继续开发新建文件夹helloos3,包含以下文件重写helloos.nas文件新指令介绍ORG:“origin”,源头,起点。该指令告诉汇编器nask,程序从指定的地方开始,即将程序装载到内存的哪个地址。JMP:跳转,相当于C语言的goto。entry:标签的声明,用于指定JMP指令...

weixin_39632379的博客 701

用 Docker 一键部署 SillyTavern酒馆 mac/windows/linux通用教程,我再也不手动折腾了!

本文介绍了如何使用 Docker 一键部署 SillyTavern 项目,适用于 Mac、Windows 和 Linux 系统。SillyTavern 是一个本地部署的大语言模型聊天界面,支持多种插件和扩展。文章详细说明了安装 Docker、拉取项目、启动容器、配置白名单、启用插件等步骤,并提供了常见问题的解决方法。通过 Docker 部署,用户可以避免繁琐的手动配置,快速搭建和运行 SillyTavern,适合希望简化部署流程的用户。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2615

基于综合阻抗特征的配电架空线路单相断线故障区段定位研究

本文提出了一种基于综合阻抗特征的配电架空线路单相断线故障区段定位方法。通过分析故障后正序、负序阻抗变化,构造综合阻抗判据实现精准定位。仿真结果表明:该方法能有效识别故障区段,差异度判据显著(故障区段达0.508,非故障区段<0.016);对过渡电阻(1-200Ω)和负荷变化具有强鲁棒性,定位准确率不受影响。相比传统方法,综合阻抗法放大了断线故障特征,解决了弱故障信号检测难题,为配电网安全运行提供了可靠的技术手段。

AI的内部世界的博客 78

Makefile各类符号

makefile总规则:欲更新目标,必须首先更新它的所有条件; 命令列表中的每条命令必须以一个Tab开头,注意不能是空格,Makefile的格式不像C语言的缩进那么随意,对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它, 在大型项目中gcc的-M选项自动生成目标文件和源文件的依赖关系冒号表示,main: main.o stack.o maze.o

邢啦 为软件事业尽一份力 1859

【四足机器人项目实战】cheetah 3/mini运动控制工程解读(附C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、主程序入口1.代码流程2.终端设置信息提示二、用MiniCheetahHardwareBridge类构造一个hw的对象并初初始化1.2.3.4.三、运行硬件桥驱动【MiniCheetahHardwareBridge】1.2.3.4.四、1.2.3.4.总结参考资料 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对cheetah3/m

qq_35635374的博客 2614

什么是makefile

1什么是Makefile 在之前学习C程序的编译过程中,我们知道编译一个程序还比较简单, 如果要编译多个文件,或者不同文件夹中的文件,需要生成不同的库文件,以及确定这些文件的编译先后顺序,往往所需要的命令行特别多,而且比较复杂,甚至对于以后项目的维护也比较麻烦。 再想想如果我们需要编译Linux内核这样好几W个文件的项目难道需要我们一个命令的输入吗 ? 那估计是一场噩梦。 那么这个时候如果我们能够把所有的编译规则全部规范到文件中,然后通过解析该文件去执行对应的编译...

jinking01的专栏 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Makefile文件:Makefile介绍

本文介绍Makefile的一些基本概念以及简单的用法。本文所用的编译器是Hightec tricore v4.9.1.0。 文章目录1 Makefile的作用2 Makefile的规则3 一个简单的Makefile3.1 帮助文档中的例子3.2 例程1:一个简单的Makefile 1 Makefile的作用 简单来说,Makefile的作用是告诉make如何编译和链接程序。我们在Eclipse界面中写好代码后,会点击一下rebuild按钮来将工程重新编译和链接。这背后就是通过Makefile来实现的。本文博

u013288925的博客 2872

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【makefile入门】makefile选项和makefile.buil

学习makefile的常用选项,并通过一个案例来学习makefile.build

jk_lovers的博客 2077

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

makefile使用MAKEFILE_LIST获取inlcude文件所在的目录

文章目的 记录下MAKEFILE_LIST的获取目录的使用技巧 测试目录 |----Makefile |----test01 |----test.txt |----001 |----test.txt |----test02 |----test.txt |----002 |----test.txt makefile 文件 #inlcue获取路径技 pkgdir ...

mjLlm的博客 2142

Makefile 入门教程

Makefile 定义了软件开发过程中,项目工程编译链、链接的方法和规则。由 IDE 自动生成或者开发者手动书写。Unix(MAC OS、Solaris)和Linux(Red Hat、Ubuntu、SUSE)系统下由 make 命令调用当前目录下的 Makefile 文件,实现项目工程的自动化编译。Windows 环境开发人员,可能并未听说过 Makefile,但是时时刻刻在使用 Makefile 来完成程序的编译,因为开发者并不需要手动编写 Makefile,而是通过 IDE 自动生成。

Doublelv 的博客专栏。 9150

Makefile 变量MAKEFILE_LIST

make程序在读取多个makefile文件时,包括由环境变量“MAKEFILES”指定、命令行指定、当前工作下的默认的以及使用指示符“include”指定包含的,在这些文件进行解析执行之前make读取的文件名将会被自动依次追加到变量“MAKEFILE_LIST”的定义域中。 这样我们就可以通过测试此变量的最后一个字来获取当前make程序正在处理的makefile文件名。具体的说就是在一个makefile文件中如果使用指示符“include”包含另一个文件之后,变量“MAKEFILE_LIST”的最后一个字只

肥叔菌的博客 8570

【Linux】Makefile

Makefile是一个包含了一系列指令的文件,这些指令定义了如何编译和链接程序。Makefile被make命令使用,make是一个构建自动化工具,它根据Makefile中定义的规则来决定哪些文件需要重新编译。

Tesseract_9527的博客 1451

Makefile中获取当前执行的Makefile所在路径

Linux下我们可以用pwd命令来获取当前所执行命令的目录,在Makefile中对应可用PWD := $(shell pwd)来获取。但是如果子Makefile 文件是从别处执行的(通过make -f .../Makefile 执行),那么$(shell pwd)得到的目录即为执行make -f命令的当前目录。在这种情况下, Makefile本身里面的命令不能对当前目录作出假设.那么如何获取被

专注探索c++,Linux等后台开发相关机制,欢迎关注,欢迎交流 2万+

Makefile新手?千万别错过了《驾驭Makefile》

Makefile新手?千万别错过了《驾驭Makefile》 网上搜索makefile教程,转载和推荐最多的就是陈皓《跟我一起写 Makefile》系列,无出其右。 这个系列很不错,适合初学Makefile,了解Makefile的各种规则、语法、依赖和命令。 网上有人说学了一下午《跟我一起写 Makefile》就会写makefile了。 我也试过,照着《跟我一起写 Makefile》学了几天,还是没能把一个小工程的Makefile写出来。所以,如果你学习了几天也没写出可以工作的Makefile来,相信我,你并

洛奇看世界 3932

Makefile入门

定义:变量名=变量值使用:$(变量名)/${变量名}clean:自定义函数不是真正的函数,本质上是多行命令放在了目标外可以传递参数$(0)为本身文件名1∗∗为要接受的参数∗∗(1)** 为要接受的参数 **1∗∗为要接受的参数∗∗(A)$(2)为要接受的参数asd没有返回值callFUNC2∗∗会报错,可以在∗∗(call FUNC2)** 会报错,可以在 **callFUNC2∗∗会报错,可以在∗∗。

zhexiangsi的博客 2357

Makefile 中获取自身目录(pwd, lastword,dirname)

命令解释 shell pwd make_dir:=$(shell pwd) // := 的意思是将$(shell pwd) 表示为make_dir,类似于宏定义 make_dir2:=$(pwd) all: @echo $(make_dir) //有输出 @echo $(make_dir2) //无输出 lastword && MAKEFILE_LIST MAKEFIL...

ym & blog 1万+

Makefile.am和makefile.in生成Makefile

很多时候,我们在网上下载的linux开源软件都会遇到一个问题,就是源码里面没有直接的makefile,但是它有Makefile.am和makefile.in或者它有Makefile.am和configure.in,这里就不详细解释他们直接的关联,直接给出如何操作生成makefile。 具体操作步骤如下: 1. 执行aclocal,产生aclocal.m4文件 aclocal是...

丨晋丨 8067
上一篇: 计组:五、输入输出系统
下一篇: 计组:七、指令系统
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值