建设网站主机可以用吗做软件开发有前途吗
建设网站主机可以用吗,做软件开发有前途吗,上海环球金融中心大厦图片,建立网站需要多少钱?Makefile中: ? 的区别 在Makefile中我们经常看到 : ? 这几个赋值运算符#xff0c;那么他们有什么区别呢#xff1f;我们来做个简单的实验 新建一个Makefile#xff0c;内容为#xff1a; ifdef DEFINE_VRE VRE “Hello World!” else endif ifeq ($(OPT),define) VRE… Makefile中: ? 的区别 在Makefile中我们经常看到 : ? 这几个赋值运算符那么他们有什么区别呢我们来做个简单的实验 新建一个Makefile内容为 ifdef DEFINE_VRE VRE “Hello World!” else endif ifeq ($(OPT),define) VRE ? “Hello World! First!” endif ifeq ($(OPT),add) VRE “Kelly!” endif ifeq ($(OPT),recover) VRE : “Hello World! Again!” endif all: echo $(VRE) 敲入以下make命令 make DEFINE_VREtrue OPTdefine 输出Hello World! make DEFINE_VREtrue OPTadd 输出Hello World! Kelly! make DEFINE_VREtrue OPTrecover 输出Hello World! Again! make DEFINE_VRE OPTdefine 输出Hello World! First! make DEFINE_VRE OPTadd 输出Kelly! make DEFINE_VRE OPTrecover 输出Hello World! Again! 从上面的结果中我们可以清楚的看到他们的区别了 是最基本的赋值 : 是覆盖之前的值 ? 是如果没有被赋值过就赋予等号后面的值 是添加等号后面的值 之前一直纠结makefile中“”和“:”的区别到底有什么区别因为给变量赋值时两个符号都在使用。网上搜了一下有人给出了解答但是本人愚钝看不懂什么意思。几寻无果之下也就放下了。今天看一篇博客无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹有时候给个例子不就清楚了吗为什么非要说得那么学术呢。^_^ 1、“” make会将整个makefile展开后再决定变量的值。也就是说变量的值将会是整个makefile中最后被指定的值。看例子 x foo y $(x) bar x xyz 在上例中y的值将会是 xyz bar 而不是 foo bar 。 2、“:” “:”表示变量的值决定于它在makefile中的位置而不是整个makefile展开后的最终值。 x : foo y : $(x) bar x : xyz 在上例中y的值将会是 foo bar 而不是 xyz bar 了。 makefile宏定义EXTRA_CFLAGS -D与CONFIG_ y EXTRA_CFLAGS -D 与CONFIG_ y 1. 假如定义一个宏CONFIG_DEBUG 在.c里面定义为#define CONFIG_DEBUG 在makefile里定义为: CONFIG_DEBUGy 假如说我们想在makefile里为.c文件进入一个宏定义就用EXTRA_CFLAGS DCONFIG_DEBUG(等价于在.c文件里定义#define CONFIG_DEBUG) 这时CONFIG_DEBUGy与EXTRA_CFLAGS DCONFIG_DEBUG的区别应该你已经看出来的前者是对makefile编译时用的比如说obj-(CONFIG_DEBUG) test.o,而后者则是对.c源文件里的用的比如说 #if defined(CONFIG_DEBUG) ... #else ... #endif 2. 假如定义一个宏CONFIG_DEBUG 3 在.c里面定义为#define CONFIG_DEBUG 3 假如说我们想在makefile里为.c文件进入一个宏定义就用EXTRA_CFLAGS -DCONFIG_DEBUG3 此时两者的定义完全相同。 Makefile中通配符*与%的区别是什么? 此两者均为通配符但更准确的讲%为Makefile规则通配符一般用于规则描述如 %.o:%c $(CC) $ -o $ 表示所有的目标文件及其依赖文件或者 $(filter %.c ,SOURCES) 此处SOURCES表示包含.c .cc .cpp等多类型源文件该过滤器函数将c文件过滤出来而%.c即为此过滤器规则。 通配符*则不具备上述功能。尤其是在Makefile当变量定义或者函数调用时该通配符的展开功能就失效了即不能正常使用了此时需要借助wildcard函数。二者应用范围不同。 Makefile有三个非常有用的变量。分别是$$^$代表的意义分别是 # 这是上面那个程序的Makefile文件: mainmain.o mytool1.o mytool2.o gcc -o main main.o mytool1.o mytool2.o main.omain.c mytool1.h mytool2.h gcc -c main.c mytool1.omytool1.c mytool1.h gcc -c mytool1.c mytool2.omytool2.c mytool2.h gcc -c mytool2.c 有了这个Makefile文件不论我们什么时候修改了源程序当中的什么文件我们只要执行make命令我们的编译器都只会去编译和我们修改的文件有关的文件其它的文件它连理都不想去理的。 下面我们学习Makefile是如何编写的。 在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖关系的说明。一般的格式是 targetcomponents TAB rule 第一行表示的是依赖关系。第二行是规则。 比如说我们上面的那个Makefile文件的第二行。 mainmain.o mytool1.o mytool2.o 表示我们的目标(target)main的依赖对象(components)是main.o mytool1.omytool2.o当倚赖的对象在目标修改后修改的话就要去执行规则一行所指定的命令。 就象我们的上面那个Makefile第三行所说的一样要执行 gcc-o main main.o mytool1.o mytool2.o注意规则一行中的TAB表示那里是一个TAB键 Makefile有三个非常有用的变量。 分别是$$^$代表的意义分别是 $--目标文件$^--所有的依赖文件$--第一个依赖文件。 如果我们使用上面三个变量 那么我们可以简化我们的Makefile文件为 # 这是简化后的Makefile mainmain.o mytool1.o mytool2.o gcc -o $ $^ main.omain.c mytool1.h mytool2.h gcc -c $ mytool1.omytool1.c mytool1.h gcc -c $ mytool2.omytool2.c mytool2.h gcc -c $ 经过简化后,我们的Makefile是简单了一点不过人们有时候还想简单一点。这里我们学习一个Makefile的缺省规则 .c.o gcc -c $ 这个规则表示所有的 .o文件都是依赖与相应的.c文件的。例如mytool.o依赖于mytool.c这样Makefile还可以变为 # 这是再一次简化后的Makefile mainmain.o mytool1.o mytool2.o gcc -o $ $^ .c.o gcc -c $ 好了我们的Makefile 也差不多了如果想知道更多的关于Makefile的规则可以查看相应的文档。 makefile里PHONY的相关介绍 PHONY 目标并非实际的文件名只是在显式请求时执行命令的名字。有两种理由需要使用PHONY目标避免和同名文件冲突改善性能。 如果编写一个规则并不产生目标文件则其命令在每次make该目标时都执行。例如 clean: rm *.o temp 因为rm命令并不产生clean文件则每次执行make clean的时候该命令都会执行。如果目录中出现了clean文件则规则失效了没有依赖文件文件clean始终是最新的命令永远不会执行为避免这个问题可使用.PHONY指明该目标。如 .PHONY : clean 这样执行make clean会无视clean文件存在与否。 已知phony 目标并非是由其它文件生成的实际文件make会跳过隐含规则搜索。这就是声明phony目标会改善性能的原因即使你并不担心实际文件存在与否。 完整的例子如下 .PHONY : clean clean : rm *.o temp phony 目标可以有依赖关系。当一个目录中有多个程序将其放在一个makefile中会更方便。因为缺省目标是makefile中的第一个目标通常将这个phony目标叫做all其依赖文件为各个程序 all : prog1 prog2 prog3 .PHONY : all prog1 : prog1.o utils.o cc -o prog1 prog1.o utils.o prog2 : prog2.o cc -o prog2 prog2.o prog3 : prog3.o sort.o utils.o cc -o prog3 prog3.o sort.o utils.o 假设你的一个项目最后需要产生两个可执行文件。你的主要目标是产生两个可执行文件但这两个文件是相互独立的——如果一个文件需要重建并不影响另一个。你可以使用“假象目的”来达到这种效果。一个假象目的跟一个正常的目的几乎是一样的只是这个目的文件是不存在的。因此 make总是会假设它需要 被生成当把它的依赖文件更新后就会执行它的规则里的命令行。 如果在我们的 makefile 开始处输入 all : exec1 exec2 其中 exec1 和 exec2是我们做为目的的两个可执行文件。 make把这个 all 做为它的主要目的每次执行时都会尝试把 all更新。但既然这行规则里没有哪个命令来作用在一个叫 all的实际文件事实上 all并不会在磁碟上实际产生所以这个规则并不真的改变 all的状态。可既然这个文件并不存在所以 make会尝试更新 all 规则因此就检查它的依靠 exec1, exec2是否需要更新如果需要就把它们更新从而达到我们的目的。 假象目的也可以用来描述一组非预设的动作。例如你想把所有由 make产生的文件删除你可以在 makefile里设立这样一个规则 veryclean : rm *.o rm myprog 前提是没有其它的规则依靠这个 veryclean目的它将永远不会被执行。但是如果你明确的使用命令 make veryclean make会把这个目的做为它的主要目标执行那些 rm命令。 如果你的磁碟上存在一个叫 veryclean文件会发生什么事这时因为在这个规则里没有任何依靠文件所以这个目的文件一定是最新的了所有的依靠文件都已经是最新的了所以既使用户明确命令 make重新产生它也不会有任何事情发生。解决方法是标明所有的假象目的用 .PHONY这就告诉 make不用检查它们是否存在于磁碟上也不用查找任何隐含规则直接假设指定的目的需要被更新。在 makefile里加入下面这行包含上面规则的规则 .PHONY : veryclean 就可以了。注意这是一个特殊的 make规则make知道 .PHONY是一个特殊目的当然你可以在它的依靠里加入你想用的任何假象目的而 make知道它们都是假象目的。 Makefile与shell脚本区别 在Makefile可以调用shell脚本但是Makefile和shell脚本是不同的。本文试着归纳一下Makefile和shell脚本的不同。 1、 shell中所有引用以$打头的变量其后要加{},而在Makefile中的变量是以$打头的后加()。实例如下 Makefile PATH/data/ SUBPATH$(PATH) Shell PATH/data/ SUBPATH${PATH} 2、Makefile中所有以$打头的单词都会被解释成Makefile中的变量。如果你需要调用shell中的变量或者正则表达式中锚定句位$都需要加两个$符号$$。实例如下 PATH/data/ all: echo ${PATH} echo $$PATH 例子中的第一个${PATH}引用的是Makefile中的变量而不是shell中的PATH环境变量后者引用的事Shell中的PATH环境变量。 3、通配符区别 shell 中通配符*表示所有的字符 Makefile 中通配符%表示所有的字符 4、在Makefile中只能在某一个target下的命令中调用Shell脚本其他地方是不能输出的。比如如下代码就是没有任何输出 VARHello echo $VAR all: .....以上代码任何时候都不会输出没有在任何target下得命令内如果上述代码改为如下 VARHello all: echo $VAR .....以上代码在make all的时候将会执行echo命令。 5、在Makefile中执行shell命令一行创建一个进程来执行。这也是为什么很多Makefile中有很多行的末尾都是“; \”以此来保证代码是一行而不是多行这样Makefile可以在一个进程中执行例如 SUBDIRsrc example all: for subdir in $(SUBDIR); \ do\ echo building ; \ done上述可以看出for循环中每行都是以”; \”结尾的。 6、获取当前目录 PATHpwd 注意是,不是’ Makefile中的shell2009-12-24 09:27:05 分类 一下摘录Makefile中调用shell的一段 install: -if [ ! -e xxx ]; then sudo mkdir xxx; fi 注意将上面的if语句写到一行的话必须在fi前面加上分号否则会出现下面错误 unexpected end of file 下面转一个相关文章 Makefile与Shell的问题 大概只要知道Makefile的人都知道Makefile可以调用Shell脚本。但是在实际使用时并不那么简单一些模棱两可的地方可能会让你抓狂。你若不信可以先看几个例子想象一下这些这些例子会打印什么内容记下你想象的结果然后在计算机上运行这些例子对照看一下。 示例一 if [ $(BUILD) debug ]; then echo build debug; else echo build release; fi all: echo done 示例二 all: CCarm-linux-gcc echo $(CC) 示例三 CCarm-linux-gcc all: echo $(CC) 示例四 SUBDIRsrc example all: for subdir in $(SUBDIR); \ do\ echo building $(subdir); \ done 说明 1. Shell脚本在target里才有效其它地方都被忽略掉了。所以示例一中”build debug”之类的字符串根本打印不出来。示例一的正确写法是 示例一 all: if [ $(BUILD) debug ]; then echo build debug; else echo build release; fi echo done 2. make把每一行Shell脚本当作一个独立的单元它们在单独的进程中运行。示例二中两行Shell脚本在两个莫不相干的进程里运行第一个进程把CC设置为arm-linux-gcc第二个进程是不知道的所以打印的结果自然不是arm-linux-gcc了。示例二的正确写法是 示例二 all: CCarm-linux-gcc; echo $(CC) 或者 all: CCarm-linux-gcc; \ echo $(CC) 3. make在调用Shell之前先进行预处理即展开所有Makefile的变量和函数。这些变量和函数都以$开头。示例三中Shell拿的脚本实际上是echo arm-linux-gcc所以打印结果正确。 4. make预处理时所有以$开头的它都不会放过。要想引用Shell自己的变量应该以$$开头。另外要注意Shell自己的变量是不需要括号的。示例四的正确写法是 示例四 SUBDIRsrc example all: for subdir in $(SUBDIR); \ do\ echo building $$subdir; \ done 感谢Thanks linux Makefile obj-m obj-y .. 分类 Linux 2013-02-20 14:01 1773人阅读 评论(0) 收藏 举报 目标定义是Kbuild Makefile的主要部分也是核心部分。主要是定义了要编 译的文件所有的选项以及到哪些子目录去执行递归操作。 最简单的Kbuild makefile 只包含一行 例子 obj-y foo.o 该例子告诉Kbuild在这目录里有一个名为foo.o的目标文件。foo.o将从foo.c 或foo.S文件编译得到。 如果foo.o要编译成一模块那就要用obj-m了。所采用的形式如下 例子 obj-$(CONFIG_FOO) foo.o $(CONFIG_FOO)可以为y(编译进内核) 或m(编译成模块)。如果CONFIG_FOO不是y 和m,那么该文件就不会被编译联接了 Linux各级内核源代码的子目录下都有Makefile大多数Makefile要嵌入主目录下的Rule.makeRule.make将识别各个Makefile中所定义的一些变量。变量obj-y表示需要编绎到内核中的目标文件名集合定义O_TARGET表示将obj-y连接为一个O_TARGET名称的目标文件定义L_TARGET表示将obj-y合并为一个L_TARGET名称的库文件。同样obj-m表示需要编绎成模块的目标文件名集合。如果还需进行子目录make则需要定义subdir-y和subdir-m。在Makefile中用obj-$(CONFIG_BINFMT_ELF) binfmt_elf.o和subdir-$(CONFIG_EXT2_FS) ext2这种形式自动为obj-y、obj-m、subdir-y、subdir-m添加文件名。有时情况没有这么单纯还需要使用条件语句个别对待。Makefile中还有其它一些变量如mod-subdirs定义了subdir-m以外的所有模块子目录。 Rules.make是如何使make进入子目录的呢? 先来看subdir-y是如何处理的在Rules.make中先对subdir-y中的每一个文件名加上前缀_subdir_再进行排序生成subdir-list集合再以它作为目标集对其中每一个目标产生一个子make同时将目标名的前缀去掉得到子目录名作为子make的起始目录参数。subdir-m与subdir-y类似但情况稍微复杂一些。由于subdir-y中可能有模块定义因此利用mod-subdirs变量将subdir-y中模块目录提取出来再与subdir-m合成一个大的MOD_SUB_DIRS集合。subdir-m的目标所用的前缀是_modsubdir_。 一点说明子目录中的Makefile与Rules.make都没有嵌入.config文件它是通过主Makefile向下传递MAKEFILES变量完成的。MAKEFILES是make自已识别的一个变量在执行新的Makefile之前make会首先加载MAKEFILES所指的文件。在主Makefile中它即指向.config。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92198.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!