哪家网站建设公司比较好,商丘网站建设的公司哪家好,中国风网站设计,通化市建设局网站今天折腾了好久#xff0c;就为了debug两个makefile的bug。虽然最后找到原因了#xff0c;但是#xff0c;怎么说呢#xff0c;用现在流行的话来说#xff0c;实在是意难平啊#xff01;必须写一篇记录一下#xff01;第一个问题#xff0c;是个语法高亮问题。今天观察…今天折腾了好久就为了debug两个makefile的bug。虽然最后找到原因了但是怎么说呢用现在流行的话来说实在是意难平啊必须写一篇记录一下第一个问题是个语法高亮问题。今天观察到makefile里一些有缩进的语句没有被正确的语法高亮比如下面这样看起来没什么毛病……就是变量B怎么不给我高亮而正常来说B应该被识别成变量正常来说B应该被识别成变量问题的原因是在写非recipe的时候缩进应该使用空格而非TAB。在写makefile中的recipe时因为实际上我们写的是希望shell执行的语句所以使用的是shell syntax。而make识别recipe的方式就是缩进使用TAB。而其他时候比如上面的例子中我们并非在写recipe这时候syntax应该按照makefile风格来写所以应当使用空格来缩进。这也正是编辑器对语法高亮识别的方式。虽然看起来只是语法高亮的问题但归根结底是make如何识别makefile中语句的问题。错误的缩进可能导致其他问题比如在下面的例子中A我们的本意是打印B的值但是执行结果却是打印了一个空行同时接着一行BB。这背后的原因就是BB这一行使用了TAB来缩进因此make把这一行也当做recipe的一部分于是将其交给Shell执行。而除此之外makefile中没有定义B的值因此echo打印了一个空行并且BB也被打印出来。Wrong !可以参考GNU Make 5.1节深入学习recipe syntax问题。第二个问题看起来就更奇怪一些。出错的代码类似下面这样A看起来打印的结果应该是B但实际上执行的结果却打印了C这个问题表面上看非常不可思议。而真正发现问题之后也让人不禁摇头感叹。这个问题其实上仅仅因为AA这一行的结尾多了一个空格。所以变量A实际上值是A 。故而ifeq语句走了else分支。这种问题知道之后觉得是个非常郁闷但makefile似乎很难避免这样的问题。因为在makefile中语句之间没有分隔符号同时对字符串变量也不需要加引号。在我们日常使用的很多语言中空格是可以自由添加的本身不代表任何含义。所以习惯了其他语言语法的我们面对这种ghost white space真的很难发现。我们只能要求维护makefile的同事多留心了。另外对于变量来说实际上前后是允许有空格的并且会被忽略掉不会当做值的一部分。但行尾的空格则相反。希望以后都不要再debug makefile问题了……愿这篇文章没有更新……