学习GNU Make

stm32h743 FM25CL64铁电存储器踩坑记录 调试FRAM经验总结: 1、跑完FRAM读写代码之后,逻分仪发现总线上只有简单、短暂的电平变化,明显不是SPI的通信数据。 (经提醒发现连片选拉高拉低都没有执行到位) 后来发现是因为片选引脚没有初始化,所以直接拉高拉低是无效的。 2、引脚成功初始化后发现CLK、MISO、MOSI数据仍不正常。通过加打印的方式发现跑到HAL_SPI_Transmit中之后还没有执行到写SPI数据寄存器的那一步就return了。 后来经提醒发现: 上图中的指针使用方式错误 后来又发现: 打印出来发现 阅读详情

本文引用 http://hi.baidu.com/flying5/blog/item/2b53308ffdc857ff513d921f.html

学习GNU Make(1)

在GNU/Linux环境下, 使用make编译程序是个不错的选择. 较之IDE, make更灵活, 更健壮, 尤其对平台适应力强. 实际上, make在上实际七十年代就出现了, 它的年纪可比你我大许多. 许多大型项目(最著名的恐怕就是linux内核)都使用make进行管理.

在众多的make版本中, GNU make是最突出的, 它已成了当前的"标准"make. 所有的GNU/Linux平台上都有提供, 一些BSD的变种, Mac OS X甚至cygwin也都使用GNU Make. 所以选择GNU make学习, 编写makefile是不二选择.

关于GNU Make, 可以看看
这篇文章. 它摘录自 o'reilly的《GNU Make项目管理》, 这本书china-pub上有得卖, 薄薄280面, 定价却要¥58, 在此鄙视一下东南大学出版社  

OK, 现在步入正题, 这里假设你使用C语言进行编程.


预备知识


首先我们必须具有一些预备知识: 你知道什么叫编译, 什么叫连接吗? 目标文件和可执行文件有什么区别? 一个C源程序是如何转化为可执行程序的? 以往的IDE往往对C初学者隐藏了这些基础概念. 要使用Make, 这些概念是要清楚的.

另外, 你需要对GNU/Linux上的编译器具有一定的了解——当然是gcc啦! 因为Makefile中的命令实际上是针对编译器的命令.

可以参考本人blog的这两篇文章:
GNU/Linux平台的C程序开发及程序运行环境
GCC笔记

几个要说明的词汇
目标(target): 在makefile指定要生成的目标, 它可以是可执行文件, 目标文件, 也可以只是一个标签.

先决条件(prerequisite): makefile中指定的针对要生成某个target所依赖的文件或标号.

命令(command): Make针对target利用makefile中指定的规则所调用的命令. 它可以是你在shell中能够指定的所有命令.

GNU Make的工作原理


 

Make 通过 makefile文件被告知它的工作: 要生成怎样的目标文件? 由哪些代码编译生成?所以学习GNU Make实际上就是学习Makefile的写法. 下面是一个简单的makefile:

hello: hello.c
    gcc hello.c -o hello


我们熟悉的hello程序,
$ make
gcc hello.c -Wall -o hello

这样我们的hello可执行程序就出来了!

make的规则:
target: prereq1 prereq2
    commands


target就是目标文件, 它可能是,o文件, 可执行文件或标签中的一种.

关于target,有这样的约定:
如果某target被包含在执行make的命令行参数中, 则更新该target; 如果make没带参数, 则将第一个target作为默认目标进行更新.

prerequisites是生成target所需要的文件.

command是make调用gcc执行的指令. 注意, command以Tab键打头, 不能是空格!

到了这里, 就可以理解Make的原理了:

make的基本思想: 对于一个target (由命令行所指定或默认第一个target), 如果它不存在, 或者它的prerequisites中有比它更新的, 那么执行command所指定的命令.
所谓"更新", 是指比别的文件更晚被修改, make通过timestamp来记录谁更新.



makefile文件名


  1. 默认情况下, make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件.

  2. 最好不要用“GNUmakefile”, 这个文件只被GNU make识别. 虽然有些Make只对全小写的“makefile”文件名敏感, 但大多数的make都支持“makefile”和“Makefile”这两种默认文件名.

  3. 可以使用别的文件名来书写makefile, 比如: "Make.Linux", “Make.Solaris”, “Make.AIX”等. 如果要指定特定的Makefile,你可以使用make的“-f”或者“--file”参数,如:make -f Make.Linux 或 make --file Make.AIX.

推荐以 Makefile 作为文件名!



命令行中调用Make命令


(1) $ make target-name
(2) $ make
(3) $ make non-exist-target
(4) $ make -n   or $ make --just-print

(1) 如果在命令行中指定了target, 则make针对该target进行工作
(2) 如果未指定target, 则make对默认target进行操作.(Makefile中出现的第一个target)
(3) 如果指定的target不存在, 则make报错:

make: *** No rule to make target `non-exist-target'. Stop.

(4) 若加上 -n 或者 --just-print选项, make只是列出将要执行的命令, 并不执行它们. 这非常有用!


Makefile 的基本语法


Makefile 采用自上而下 (top-down)的组织, 最开始的target即"终极目标", 也是默认target. 观察make输出的命令可以发现, 它们的顺序与出现在Makefile中的命令刚好相反. 可以把Makefile中针对target的规则想象成C函数. 最开始的是main(), 然后依次调用相关的函数(即针对prereq调用相关的规则).

看看一个比较简单的Makefile规则:

target1 target2 target3 : prereq1 prereq2
    command1
    command2
    command3
  • 第一行列出了targets和prereqs, 注意目标与它们依赖的文件之间以" : "分隔. 目标或prereq之间以空格分隔.

  • 在冒号左边可以有1个或多个targets, 在冒号右边可以有0个或者多个prerequisites. 如果prerequisite的数目为0, 则只有当对应的target不存在时才执行命令.

  • 如果command不和目标, 先决条件在一行,那么它之前必须以Tab开头; 如果command与目标, 先决条件在一行, 那么它要以";"开头. Make将command传递给子shell去执行.

注意: 不要忘了在命令以Tab开头, 也别在不是命令开头的地方输入Tab, 否则Make会将它之后的字符当作命令.
  • Make中的注释符为 "#". #之前可以有空格, 从#开始到行尾的所有字符都会被忽略. 注意: 如果你把#写在了命令中, 包括#在内的行都会传递给shell, 会有什么样的结果取决于你所用的shell.

  • 可以在Makefile中使用转义字符 /, 我们都知道, 在命令行中, 可以使用 / 在下一行输入命令. 同样的, 在Makefile的所有行中, 都可以使用 / 来分割太长的语句.

    学习GNU Make (2): 规则

Makefile中指定了针对某个target的规则(rule). 注意Makefile中可以有多条规则: 即针对Makefile中的一条targets, prerequisites列表, 就有一条对应的规则.

规则指定了target: 要更新的目标, 及目标所依赖的先决条件, 并指定了更新目标所采取的行为: command.

如果prerequisites比target更新, 那么Make就利用Makefile中所指定的命令脚本来更新目标. 同样地, prerequisites也可能是另一条规则中的目标, Make会查看属于它的先决条件是否比它更新以执行它的规则中的命令脚本. 这类似于C中的函数调用, 在Make中, 这些依赖关系建立了"依赖图"(dependency graph).

关于target和prerequisite的依赖性, 我们可以理解它有两方面的含义:
(1) 要生成targets, 先要保证它依赖的prerequisites是最新的
(2) 保证prerequisites在在targets之前被更新.

规则包含两个部分, 一个是依赖关系, 一个是生成目标的方法. GNU Make支持五种规则: Explicit rules, Pattern rules, Implicit rules, Static pattern rules, Suffix rules. 后面会介绍它们. 在了解这些规则之前, 我们先弄清makefile中通配符, 伪目标, 变量, VPATH, vpath的用法.

通配符


在Makefile中可以使用通配符, GNU Make能够识别Bash的通配符(参考《学习Bash》, p22):
~       : 当前用户的home目录
~zp    : 用户zp的home目录
*.o      : 所有的目标文件
?         : 单个字符
[abc]   : a, 或b, 或c
[a-zA-Z]: 所有大小写字母
[!0-9] : 所有的非数字

最好不要使用*通配符, 它可能使你无意引入一些不相关的文件.

出现在targets, prerequisites中的通配符由Make展开, 而出现在commands中的通配符由shell展开.

若想使用通配符所代表字符的原意, 在它之前加上转义字符/: 比如/?表示问号, 而非任意单个字符.

伪目标 (phony targets)


正如前面所说, 目标不仅可以是文件, 也可以标签. 用作标签的目标就是一个伪目标. 伪目标一般用来定义一个代表一条命令脚本的标签(也可以为伪目标指定prerequisites).

GNU Make是无法区别目标文件和伪文件的. 这样就存在一个问题, 如果你在Makefile里用到了一个标签, 如clean, 用以删除生成的中间目标文件:

clean:
   rm -f *.o

如果当前目录刚好有一个名为clean的文件, Make就会把这个你想用作伪目标的clean与clean文件关联起来, 当你运行 $ make clean 时, 由于clean不存在prerequisites, make 会给出这样的信息:
make: `hello' is up to date.

如何解决呢? 这里就引入了.PHONY. 以下面的格式来生命一个伪target:

.PHONY : clean
clean:
    rm -f *.o


.PHONY告诉了Make: 它后面的prerequisite, 也就是clean是一个伪目标.

.PHONY的作用:
(1)告知Make, 该伪目标并不是真正的文件, 不遵循由源代码生成目标文件的规则.
(2)告诉Make, 该伪目标始终需要被更新.

由于伪目标始终需要被更新, 那么如果它作为某个目标文件的prerequisite, 那么在每次调用make时都会执行命令. 所以通常不将伪目标作为prerequisite. 但给伪目标指定prerequisite非常有用(实际上就是让这些prerequisites对应的命令在伪目标被指定为target的时候被执行).

我们来看看这个例子: 该makefile同时生成多个可执行文件, 而且只需输入"make"

all : prog1 prog2 prog3
.PHONY : all

prog1 : prog1.o utils.o
    gcc -o prog1 prog1.o utils.o
prog2 : prog2.o
    gcc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
    gcc -o prog3 prog3.o sort.o utils.o

all是第一个target, 即为默认的target. 由于指定了all是一个伪目标, 所以all总是要被更新. 于是, 它的三个prerequisites: prog1, prog2, prog3所对应的规则也需要被裁决, 看它们各自是否需要被更新. 由此, 一条简单的make语句就可以生成多个可执行target.

注意: all : prog1 prog2 prog3 和 .PHONY : all 出现的前后顺序在这里是无关, 但最好将.PHONY : all放在前面, 这貌似更符合习惯.

注意, 在上述情况下, 如果生成的prog1, prog2, prog3不需要更新, make反馈的信息为:
make: Nothing to be done for `all'. 它不同于(非伪)目标不需要更新的信息: `<target>' is up to date.

变量


变量以这样的形式被定义:

$(variable-name)

它表示我们希望将名为variable-name的变量在makefile中扩展.(可以把它理解成C语言中的宏)

变量能包含所有的字符, 符号. 比如:$( compile.c)

变量的格式: 除了单个字符可以直接跟在$之后外( $?), 其他的变量都必须用()或者{}引起来.

我们可以自己定义变量, 同时, Make也会自动建立一些变量(自动变量).

自动变量(automatic variables)
自动变量一般用来表征target或prerequisites, 这样你就不用显式地指定它们的名称. 一共有7种自动变量:

$@    : target
$%    : archive menmber specification
$<    : 第一个prerequisite
$?     : 所有比target新的prerequisites, 它们之间以空格分隔.
$^    : 所有的prerequisites(但不包括重复的prerequisites).
$+    : 与$?相同, 但包括重复的prerequisites.
$*     : 目标文件名的主干(既不包括后缀), 它一般只用于pattern rules.

针对上面的自动变量, 有的版本的Make还提供了变种: 在变量名之后加上D表示变量的目录部分, 加上F表示变量的文件部分. 如: $(<D). 在GNU Make中提供了更好的表示目录和文件的方法, 所以不提倡用这些变种.

由于自动变量是Make在建立target和prerequisites的对应关系后自动生成的, 所以只能在command中用到它们!

利用VPATH和vpath来查找文件


对于非常简单的项目, 我们可以把所有的源代码, 头文件和Makefile一起放在同一个目录. 但对于比较复杂的情况(有比较多的头文件, 源代码文件. 这往往是现实中经常存在的情况), 我们一般把代码分类, 放在不同的目录中. 一种比较简单的做法就是将源代码文件放在src(或source)目录, 将头文件放在include目录. 然后将Makefile放在它们的父目录.

如果你不在调用make时明确地作出规定, make只在当前目录中搜索targets和prerequisites. make将makefile所在的目录默认为搜索路径优先级最高的目录, 即先在当前目录查找文件, 若找不到, 再到VPATH, vpath指定的目录查找.

下面以2种情况来说明文件查找的问题, 给出了对应的3个Makefile和2个.c文件.

VAPTH

VPATH语法: VPATH = dir1 dir2 ...

在UNIX下, 目录用" " 或 ":"分隔, 在windows下, 目录用 " "或";"分隔. 推荐使用空格!

1, 在当前目录创建一个src目录, 里面放置hello.0.c, 一个Makefile.0. 它们的内容分别如下:

/* hello.0.c */
#include <stdio.h>
int main(void)
{
    printf("hello, world!/n");
    return 0;
}

#Makefile.0
hello: hello.c
    gcc -Wall -o hello hello.c

在Makefile所在的目录运行make -f Makefile.0, 会得到这样的报错信息:

make: *** No rule to make target `hello.0.c', needed by `hello.0'. Stop.

这正是由于Make默认地在当前目录搜索target和prerequisites. 将Makefile改写为如Makefile.1所示, 在其中引入了VPATH变量.

#Makefile.1
VPATH = src

hello.0 : hello.0.c
    gcc -Wall -o hello.0 hello.0.c

运行 $ make -f Makefile.1, 我靠, 还是报错? 没办法, 把命令改为如下:
gcc -Wall -o $@ $<

这下就成功了, 是不是要使用VPATH, 命令行就必须用make的自动变量代替文件名呢?

下面在Makefile所在的目录创建include目录, 在里面放个hello.h (内容很简单: #include <stdio.h>), 并将hello.c改写为:

/* hello.1.c */
#include "hello.h"
int main(void)
{
printf("hello/n");
return 0;
}

Makefile当然要改写:

#Makefile.2
VPATH = src include
CFLAGS = -I include

hello.1 : hello.1.c hello.h
    gcc $(CFLAGS) -Wall -o $@ $<

有两点值得注意的地方:
(1) src, include都包括在VPATH中, 要告诉Make在哪里搜寻source, .c和.h文件的目录都要指定.
(2) VPATH只是告诉了Make在哪里寻找文件, 而gcc并不知道在哪里寻找hello.h (即VPATH只和Makefile中的target, prerequisites相关, 而不和command相关). 所以要声明一个CFLAGS变量. gcc $(CFLAGS) == gcc -I src/ .
还有一个值得注意的地方: 这里使用$<, 指代第hello.1.c. 如果用$^, 会把hello.h也包含进去, 而gcc的命令行中是不带.h文件的. 如果有多个.c文件, 使用变量表征它们的时候就要斟酌一下了.

使用VPATH有一个隐患: VPATH在每个目录中搜索所有的source文件. 如果一个相同的文件名出现在不同的目录中, VPATH将第一个搜索到的文件作为结果.

考虑下面的情况: make搜索hello.1.c和hello.h文件, 它首先在当前目录找到了hello.1.c, 但找不到hello.h, 于是它到VPATH, vpath指定的src和include去查找, 在src目录它又发现了hello.1.c文件, 但它将之前在当前目录找到的的hello.1.c作为优先的prerequist, 随后它又在include目录找到了hello.h: 将原本位于src目录中的hello.1.c拷贝到Makefile.2所在的目录, 修改其printf()语句, 让其显示"from the wrong dir!", 再次执行make -f Makefile.2, 运行新生成的hello.1, 我们会发现是错误的hello.1.c被编译了.

vpath
使用vpath较之VPATH更灵活. 它的基本语法为:

vpath <pattern> <directory-list>

其中<pattern>和<directory-list>都是可选的, 由此有三种使用vpath的方法:
1, vpath <pattern> <directory-list>
指定符合<pattern>模式的文件的搜索路径为<directory-list>.
2, vpath <pattern>
清除符合<pattern>模式的文件的搜索路径.
3, vpath
清除所有通过vpath所设置的文件搜索路径.

<pattern>中需要包含"%"字符, 它类似于扩展符中的"*", 表示匹配0或若干字符. 如: %.c 表示所有以.c结尾的C源文件.

可以利用vpath将Makefile.2改为如下:


"vpath %.c src" 和"vpath %.h include" 告诉Make在src目录搜索.c文件, 在include目录搜索.h文件.
要注意的是, 如果hello.1.c仍位于当前目录, make还是会将它作为首选, 而非vpath所指定的位于src目录中的hello.1.c!

VPATH is good for finding sources, not for finding targets.

还可以利用vpath来指定目标文件的路径, 后面再讨论.

注意使用VPATH和vpath时使用自动变量!

VPATH和vpath的比较
1, VPATH是make的特殊变量, 而path是make的关键字.
2, make首先在当前目录搜索文件, 并将位于当卡那目录的文件作为首选的prerequisites, 若在当前目录找不到该文件, 再到由VPATH或vpath指定的目录去搜索.

(一) 显式规则(Explicit Rules)


在makefile中显式指定了targets, prerequisites. 这即使用了make的显式规则, 它是我们常用的规则.

(二) 模式规则(Pattern Rules)


如果使用的文件比较多(比如需要使用大量的.o), 再使用显式规则, 输入那些.c, .h文件名就有点让人抓狂了. 在这种情况下可利用Make的自动推导(模式规则), 这样就不用针对每个.o文件声明command了.

利用下面的Makefile可以生成前面的hello.1:

#Makefile.4
vpath %.c src
vpath %.h include
CFLAGS = -I include

%: %.c %.h
    $gcc -Wall $(CFLAGS) -o $@ $<
hello.1:

利用Pattern Rules, 可以让Make进行自动推导: Make看到一个finename目标, 就会将filename.c和filename.h加入到prerequisites.


Static Pattern Rules


它和前面的Pattern Rules只有一个区别: 限定了针对那些target使用你给定的命令. 可以将Makefile.4改写为:

#Makefile.5
vpath %.c src
vpath %.h include
CFLAGS = -I include

OBJECTS = hello1

%(OBJECTS): %.c %.h
    $gcc -Wall $(CFLAGS) -o $@ $<
hello.1:

【AI工具】免费获取各类AI大模型APIKEY的使用教程,以硅基流动+Deepseek为例 阅读详情

相关推荐

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

GNU Make工具(一)简介

GNU Make是什么1 Make有很多版本,其中GNU Make是一个自由软件。这里介绍一下它。 GNU Make是一个控制计算机程序从代码源文件到可执行文件或其他非源文件生成过程的工具。 控制命令通过称为makefile的文件传递给make工具。makefile记录了如何生成可执行文件等命令。 Capabilities of Make Make enables the end user t...

深空深蓝的博客 1万+

USB2.0物理层实战:手把手教你用示波器抓取D+/D-信号(附波形分析)

本文是一份针对硬件工程师的USB2.0物理层信号调试实战指南。文章详细讲解了如何使用示波器捕获和分析D+/D-差分信号,从基础设置、核心信号状态解读,到信号完整性分析与常见问题排查,手把手教你定位USB通信故障。内容涵盖USB2.0协议物理层关键概念,并附有基础解码思路,旨在提升工程师的底层调试能力。

s8t9u0v1w的博客 450

GNU make 中文手册 第一二章 概述与介绍

一、第一章:概述 准备知识 在开始我们关于 make 的讨论之前,首先需要明确一些基本概念: 编译:把高级语言书写的代码,转换为机器可识别的机器指令。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行。编译时,编译器检查高级语言的语法、函数与变量的声明是否正确。只有所有的语法正确、相关变量定义正确,编译器就可以编译出中间目标文件。通常,一个高级语言的源文件都可对应一个目标文件。目标文件在 Linux 中默认后缀为 “.o”(如 “foo.c” 的目标文件为 “foo.o” )。为了和规则的目标文件相

weixin_42109053的博客 1155

行人检测模型在海思平台上的部署:从 PyTorch 到 NNIE 深度优化与实践

摘要 本文详细介绍行人检测模型从PyTorch到海思NNIE平台的部署流程。首先分析了行人检测面临的挑战(尺度变化、遮挡、姿态多样性等)及边缘部署的优势(实时性、隐私保护等)。重点阐述了模型转换过程:PyTorch→ONNX→Caffe→NNIE-WK,其中PyTorch转ONNX需注意评估模式设置、虚拟输入匹配、操作集版本选择等关键点。文章旨在帮助开发者在海思3516D芯片上实现高效的行人检测,克服部署过程中的常见问题,最终实现边缘设备的实时目标检测能力。

FJN110的博客 216

AUTOSAR知识点 之 XCP (二):XCP基础概念

学习XCP的过程中,对XCP的基本概念要做一个全面的认知,因为里面有很多缩写以及难以理解的点,假设对此模模糊糊一知半解,那么对整个协议栈的认知会遇到极大的障碍。XCP的信号流传输图示如下XCP 标准主要分为 5 个部分:这部分提供了对于协议的一个概况介绍,包括 XCP 的功能和基础性内容。这部分内容对协议层进行了详细的规范和说明。

梦想技术家 2769

一、GNU Make基础

本篇学习笔记主要总结了《GNU make》里面前三章部分的一些重要知识点,引入了一些重要的概念,为方便后续章节的学习打下基础。

xiaobingshidabing的博客 1924

Microsemi Libero系列教程(二)——新建点灯工程

前言 上一篇文章,介绍了Microsemi Libero系列教程(一)-Libero开发环境介绍,下载,安装与注册,作为嵌入式开发中的Hello World,点灯是再也基础不过的实验了,通过点灯实验,可以了解芯片GPIO的控制和开发环境IDE新建工程的流程,对于FPGA来说,每个IO口几乎一样,所以本篇文章主要学习一下如何基于Microsemi Libero集成开发环境建立一个示例工程,让一个L...

whik1194的博客 1万+

GNU make

以下的知识来源于网络,如有侵权,请联系我删除哈 1、基本语法 目标:依赖 命令 # 在命令前加@,就能不打印本句命令在控制台上 例子: all: echo "hello world" 结果: 在执行命令语句前加@: all: @echo "hello world" 2、变量 系统变量(隐藏变量):就是make程序内部定义好的的变量 all: @echo "$(CC)" # 变量 CC: c语言编译器,默认是cc @echo "$(AS)" # 变量 AS

sidongzhong的博客 863

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

基于深度学习的异常检测实战:从自编码器到GAN

本文通过一个完整的实战案例,展示了如何使用自编码器和GAN进行异常检测。我们详细介绍了数据准备、模型定义、训练和评估的步骤,并提供了可运行的代码。希望本文能为读者在实际项目中应用异常检测技术提供实用的指导和启发。

Programming Talk 242

GNU Make构建工具使用教程

1.基本概念 将源代码变成可执行文件叫做编译(compile);先编译这个,还是先编译那个(即编译的安排)叫做构建(build)。 Make是一种常用的构建工具,主要用于C语言项目。但是Make并不限于某种编程语言,也不限于编译代码的场景。任何“只要某个文件发生变化,就需要重新构建”的场景都可以用Make构建。 Linux系统自带了make命令;Windows系统需要安装MinGW,使用安装目录下的bin\mingw32-make.exe。make命令从当前目录下名为Makefile的文件中读取构建规则。

zzy979481894的博客 1万+

042、双管反激的电压应力优势

【摘要】本文通过300W工业电源炸管案例,对比分析了单管与双管反激拓扑的电压应力差异。单管反激因漏感能量难以处理,尖峰电压可达1180V,需依赖RCD吸收电路但效率低下;双管反激通过钳位二极管将漏极电压限制在输入电压水平(实测650V),能量回馈使效率提升2-3%。虽增加两个MOS管,但可选用600V器件(单管需1200V),总成本反降15%以上。作者建议150W以上或高压输入场景优先采用双管反激,其确定的电压应力可显著提升可靠性,避免单管反激的参数玄学问题。关键设计要点包括快恢复二极管选型、紧凑布局及漏感

Jack010169的博客 83

GNU make学习——用的不多,但不懂的话会很麻烦。

最近先要把gnu的东西看看,不然以后跨平台开发会很麻烦。经过很长一段时间的左思右想,最后还是决定以后的开发编译器要紧紧依靠gnu了,这也是现在能想到的比较划算的选择。平时的基础联系还是用borland compiler来完成,c++ builderX也可以使用GNU的。写个开始。先声名,我这里不是翻译,是为了以后自己方便写的理解后的内容,我不会放到文档里,但是要是有人看了,还请不要来打击我的积极性

龙龙眯起来 1489

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

GNU MAKE学习

Linux程序员必须学会使用GNU make来构建和管理自己的软件工程。GNU的make能够使整个软件工程的编译、链接只需要一个命令就可以完成。      make在执行时, 需要一个命名为makefile的文件。makefile文件描述了整个工程的编译,链接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译;需要创建哪些库文件以及如何创建这些库文件、如何最后产生我们想要得到的可执行文件。

zkpingguo的博客 481

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

学习GNU Make (1)(转)

在GNU/Linux环境下, 使用make编译程序是个不错的选择.较之IDE, make更灵活, 更健壮, 尤其对平台适应力强.  实际上, make在上实际七十年代就出现了,它的年纪可比你我大许多. 许多大型项目(最著名的恐怕就是linux内核)都使用make进行管理. 在众多的make版本中, GNU make是最突出的, 它已成了当前的"标准"make. 所有的GNU/Lin

yanzxiang的专栏 900

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

GNU make中文手册 学习总结摘要

本文主要参考 GNU make中文手册 做一些简单的摘抄总结。

黄老板的专栏 1722

gnu make学习笔记一

gnu make, gcc "-M"参数, 正则表达式, 自动生成依赖, sed反斜杆, shell元字符

郭月丰的专栏 807

GNU make学习

Makefile Makefile文件是描述make命令工作内容的文件 就是说Makefile会告诉make需要做什么怎么做,文件与文件之间的依赖关系,可以说Makefile是make命令在编译对应模块时的配置文件 一个简单的 Makefile 描述规则组成: TARGET...:PREREQUISITES... COMMOND ... ... target:规则的目标

jonloong的专栏 509

【Linux学习笔记⑤】——GNU C语言开发环境【GNU make、静态库】

关键词:GNU C、Linux、项目管理工具——GNU make、静态库、共享库

Wang_Dou_Dou_的博客 2817

GNU make 学习 1

1. Overview of make make 遵循的标准:GNU make conforms to section 6.2 of IEEE Standard 1003.2-1992 (POSIX.2). 这句话很重要,明确地给出了make的功用:它不限于编程语言,也不限于编程,只要是当一些文件改变时,另一些文件需要自动更新的情况都可以使用make。Our examples show C pro

龙龙眯起来 956

GNU make 学习总结

个人写了一个简单的makefile通用模板,编译CPP或者C程序,见下一篇日志。 http://blog.csdn.net/felixit0120/article/details/7663756   GNU make学习总结:  1.$(patsubst PATTERN,REPLACEMENT,TEXT) 函数功能:搜索"TEXT"中以空格分开的单词,将符合模式PATTERN替换为REP

w._.m 1355

GNU make 学习笔记 一

make实用程序(指执行公共服务功能的程序)可以找出大型程序中哪部分需要重新编译,并执行命令来重新编译它们。 GNU make遵循IEEE标准 1003.2-1992(POSIX.2)的6.2章节。 我们的例子中使用的是C语言,因为这是最常见的。make程序也可以用于其他任何可以用shell命令运行编译器的语言。make程序也不仅限于程序,你可以把它用于其他任务,只要这些任务在一些文件改变时需要更新另一些文件。 为了使用make程序,你需要一个名为makefile的文件,其中描述了你的程序中各文件的关系和更

tus00000的博客 438

gnu make学习

1.makefile的简介    自动化编译链接生成目标程序 2.makefile的规则    2.1 TARGET... :PREREQUISITES...       COMMAND       ...       ...  command:规则的命令行。是规则所要执行的动作(shell命令或者是在shell下执行的程序)。它限定了make执行这条规则时所需要的动

shuzjd的专栏 778

GNU make学习笔记(1)

我学习的make版本是GNU Make 3.81,平台是Linux 2.6.27-11-generic 。在Linux(unix)环境下使用GNU 的make工具能够比较容易的构建一个属于你自己的工程,整个工程只需要一个命令就可以完成编译、链接。不过这需要我们投入一些时间去完成一个或者多个称之为Makefile文件的编写。此文件正是make正常工作的基础。在正式学习前,必须了解一下GNU下

timke212004的专栏 517
下一篇: GCC笔记
linuxc2008
博客等级 码龄18年 15粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值