Skip navigation.

Fat R笔记……与减肥无关

Fat awful terrible Rubbish-bin

Makefile学习笔记

一个简单的Makefile学习笔记……

- 对于一个简单的程序foo.c,可以直接用命令gcc -o foo foo.c把它编译成可执行文件,也可以写一个Makefile,用make命令来编译和链接

- gcc的编译选项-c表示只进行编译,生成obj文件,不进行连接。如gcc -c -o foo.c foo.c

- gcc源文件为obj文件时,将进行链接并生成执行文件。如gcc -o foo foo.o

- 命令gcc -M foo.c可以生成foo.c依赖的头文件的列表。使用这个列表作为Makefile某个Target的依赖文件,即可保证修改了头文件但没修改foo.c的情况下,make仍然会重新编译Target。
(如果用 -MM 来代替 -M 传递给 gcc,那些用角括号包围的头文件将不会被包括。)

- 一个简单的Makefile
OBJS = foo.o
CC = gcc
CFLAGS = -Wall -O -g

foo: $(OBJS)
       $(CC) -o foo $(OBJS)

这里,foo是第一个target,也是默认的target。即make相当于make foo。
可以看到,foo依赖的target为$(OBJS),展开后就是foo.o。

这里并没有给出foo.o的相关规则,因此make会使用隐含规则来先生成foo.o:
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $<-o $@
因此,make实际执行的命令是:
gcc -Wall -O -g   -c -o foo.o foo.c
gcc -o foo foo.o

其中第一个是用隐含规则建立foo.o,第二个才是用Makefile里的规则建立foo

- 上面的Makefile可以改成:
OBJS = foo.o
CC = gcc
CFLAGS = -Wall -O -g

foo: $(OBJS)
        $(CC) -o $@ $^

这里用$@和$^分别代替foo和foo的依赖文件$(OBJS)。这两个都是预定义的宏变量。
具体地,$@ 扩展成当前规则的目的文件名, $< 扩展成依靠列表中的第一个依赖文件,而 $^ 扩展成整个依赖的列表(除掉了里面所有重复的文件名)

- clean规则:
clean:
        @echo Clean all...
        @rm -f *.o
        @rm -f hello

@符号跟dos下批处理的@一样,表示不显示该行命令。
rm如果不加-f开关,就会在被删除文件不存在时提示出错,造成make过程出错中止。

- 可以在命令行指定宏变量,如:
make "LIBES= -LL -LS"


- SOURCES = $(wildcard *.c) 其中wildcard是一个函数,而不是shell命令

- =表示引用,:=表示展开。例如:
A = foo
B = $(A)
# 现在 B 是 $(A) ,而 $(A) 是 'foo' 。
A = bar
# 现在 B 仍然是 $(A) ,但它的值已随着变成 'bar' 了。
B := $(A)
# 现在 B 的值是 'bar' 。
A = foo
# B 的值仍然是 'bar' 。

fb归...石牌东是个诡异的地方...

,

觉得次次跟dir他们一起fb都会有一些状况
在bbs上花了一个小时时间,淘汰了蛇咬鸡/龙凤煲、羊肉煲狗肉火锅/狗肉煲羊肉火锅等各种动物(嗯……下次去北京如果再有人好奇广东人的饮食习惯,我应该可以比较好地回答了吧)以及日本料理等方案,好不容易最后终于把地点锁定在山天野生菌(其实我也不知道去这种地方到底是吃啥的)
找到经纬度在google earth上确认好位置后(因为有境界已经达到了神的级别的路痴,所以这类高科技手段是必须的……而且经过google earth确认后路痴发现那条路其实就是自己家附近走过很多次的那条嘛!

坐53到达国防大厦的时候没看到dir和total,于是打算自己先溜达找地方。然而沿着石牌东走了一段路,估计应该有200米了,根据网上的描述应该已经到了,但却完全没有发现任何跟野生菌这种物体有关的地方。这时接到total的电话,问我在哪,还说他半个小时也找过了,结果也没找到。于是三人会合后,再沿路仔细搜寻。结果在三颗空虚的胃的驱动下,那6颗闪烁着绿光的眼睛仍然没有发现目的地。还好沿路看到了不少食肆,至少算是有后备方案。

无奈之下,只好再次借助科技的力量,打电话回去叫乐于助人的火天同学帮忙到bbs上帮我们从遗留在版面的水里把那店的地址电话和周围标志性建筑打捞出来。然后我们根据得到的反馈线索,开始寻找书店小学客家王以及石牌东路139号

然而让我们感到恐怖的是,这些地方统统没看到!仿佛全都离奇失踪了似的,如果一家没找到还可以理解,但全都没找到就比较诡异了。而且更诡异的是,一路看着门牌号,99...127...137..然后是一排建筑(其间能吃饭的好像只有一家羊肉火锅店),然后……居然又看到137,过了一条小路的路口,就变成了171……(其实我之前设想比较坏的情况是找到139却发现那里是一间厕所,结果人算不如地算,我们连看到139的缘分都没有)

靠,难不成一段路都被愤怒的冥王星人绑走了?不过既然那里还有条小路,就看看那些消失的门牌号是不是在那巷子里吧。沿着那小路走,一开始我们看到了151号,然而再继续深入,门牌号就变成了另外一条路的了。而在这边我们还发现了一块提醒注意学生过马路的交通标示牌,却仍然没有发现小学的存在。

现在我们只好承认凭着我们的力量和所掌握的资讯,是没办法找到那家神秘的餐馆了(一开始过于自信,愣是没问路,落得这种下场也是死有余辜),最后的救命稻草就只有它的电话了。dir拿出电话,拨号,然后马上 ——“The number you dialed doesn't exist”

不甘心的我们也拿出电话尝试了一下,结果也同样得到了中、英文双语的冰冷的回答……这句话的意思跟“你们这些猪头,出来找吃的也不先看看那帖有多老了”应该是同意的。靠,所以说,老帖害人啊~~~所以见到火星帖天王星帖,一定要不遗余力地喊土呕的!

那么只好随便找一家吃了……(过程略,而且我第一次吃到水蛇粥,也勉强算是学会怎么吃蛇了。)

最后回到各自的窝,dir在bbs上总结到:

太神奇了…………
极偏僻的地方就那么在极热闹的地方之间存在着……

而且那里热闹归热闹
总是有点不太自然的感觉……
热闹得没什么存在感…………
一路走过去都觉得恍恍惚惚的
看到什么店都没什么印象……
(当然也可能是饿了一天头晕晕ing的结果……)

一离开那条街就其他地方都是冷冷清清的…………



而我当时的感觉就是……人人心中都有一个寂静岭/这里一定是个平行宇宙,一定会有个老头子突然冒出来,问我们是不是想去石牌东路139号,向着那颗树的中间走就能走到啦(补充说明,这段有部分也是dir&total的创意)……

灌水


1 升级了Opera到这周的weekly,不知道跟8585比有什么倒退呢……

2 昨天面完北电,等通知了……好想好想北电的offer啊><

3 要写开题报告,好烦……

4 继续找工吧……HSDC的申请表还没填完-_-||||

5 FTerm发神经,老是方向键没反应,考虑扔掉它换CTerm...

唉。。。找工作真难。。。

难道我真的那么差么~><~

cvim (c-support)插件

Vim插件c.vim为c/c++程序员提供了“代码模板”等一些实用功能,可以更有效率地编写出格式美观的程序,甚至使VIM具有一些IDE的功能。

然而在用\ip插入printf()时,发现插入的东西变成了
printf )x\nx);F)r(fxr"fxr"2hi

看看~/.vim/ftplugin/c.vim,这个命令的原文是:
map    <buffer>  <silent>  <Leader>ip    <Esc><Esc>oprintf )x\nx);<Esc>2F)r(fxr"fxr"2hi

试着在Normal mode下copy & paste oprintf )x\nx);,然后按<Esc>,然后C&P 2F)r(fxr"fxr"2hi,发现是可以正常得到printf ("\n");的。后来发现,当在Insert Mode下按<Esc>后马上按2,居然会又回到Insert Mode,而如果按下<Esc>,等待一下再按2则不会。用:map命令可以看到<Esc>2这个序列被绑定成tabbar.vim的一个命令了:
   <Esc>2      & :call <SNR>13_Bf_SwitchTo( 2)<CR>:<BS>


那么,可以修改tabbar.vim屏蔽掉这个绑定,或者改c.vim绕开<Esc>2:
 map    <buffer>  <silent>  <Leader>ip    <Esc><Esc>oprintf )x\nx);;<Esc>x2F)r(fxr"fxr"2hi


增加了一个;,<Esc>后是x,也就是删除这个;,然后就是后继的命令,这样就可以得到正确的结果了。

注:所有的按键可以在文档c-hotkeys.pdf中查看到

解决了autosave脚本的ajax caching问题

现在脚本应该能正常工作了。
昨天发现Opera Blog把no-cache写成nocache造成页面被浏览器缓存的bug,下午报告过去,晚上已经修正了(然而据说现在用的方法兼容性并不太好,但至少对我没什么影响了)

然而我的脚本还是有问题,使用load功能时load的页面仍然被缓存了(这样就无法load到最近保存的内容)。估计可能用javascript来Get页面的时候opera只是根据服务器返回的header来判断页面是否应该被缓存。google了一下ajax caching的问题,找到了几个解决办法:

最简单的,把GET请求改成POST请求:
req.open('POST', sURL);

关于GET和POST,这里有详细的解释:
http://www.w3.org/2001/tag/doc/whenToUseGet.html

还有一种方法也比较简单,就是在请求的URL中加上一个随机参数:
req.open( "GET", "xmlprovider.php?sid=" + Math.random());

这样浏览器就会因为每次URL不同而不会从缓存中读取页面了

对上面方法的一个改进是用timestamp代替那个随机参数:
function uncache(url){
  var d = new Date();
  var time = d.getTime();
  return url + ‘&time=’+time;
}
...
req.open( "GET", uncache(sURL));

*写成sURL + "&time=" + new Date().getTime();应该也可以

最后,我决定还是用第一种方案。虽然用POST来请求页面对我来说感觉有点怪(而且某些server可能不支持用POST获取页面),但与另外两种方法相比,它可以避免每次请求回来的页面都被缓存(以及被中间的proxy缓存)。


其它参考资料:
http://en.wikipedia.org/wiki/XMLHTTP
http://www.enja.org/david/?p=25
http://radio.javaranch.com/pascarello/2005/10/21/1129908221072.html
http://ajaxian.com/archives/ajax-ie-caching-issue