一 : 从头开始 运动发带打造街头运动风
其实我们看看韩国街头那些运动休闲风的女性就不难知道了。(www.61k.com)运动发带已经不仅仅是运动的配搭,而是时尚搭配的一种饰品,生活的一种态度。
简单的发带,更能衬托日常的运动魅力。对,就是它,运动发带,现在再一次牵起街头运动风潮。
二 : 从头开始写项目Makefile(五):嵌套执行
【版权声明:转载请保留出处:blog.csdn.net/gentleliu。(www.61k.com)Mail:shallnew at 163 dot com】
在大一些的项目里面,所有源代码不会只放在同一个目录,一般各个功能模块的源代码都是分开的,各自放在各自目录下,并且头文件和.c源文件也会有各自的目录,这样便于项目代码的维护。这样我们可以在每个功能模块目录下都写一个Makefile,各自Makefile处理各自功能的编译链接工作,这样我们就不必把所有功能的编译链接都放在同一个Makefile里面,这可使得我们的Makefile变得更加简洁,并且编译的时候可选择编译哪一个模块,这对分块编译有很大的好处。
现在我所处于工程目录树如下:
.├── include│ ├── common.h│ ├── ipc│ │ └── ipc.h│ └── tools│ ├── base64.h│ ├── md5.h│ └── tools.h├── Makefile├── src│ ├── ipc│ │ ├── inc│ │ ├── Makefile│ │ └── src│ │ └── ipc.c│ ├── main│ │ ├── inc│ │ ├── Makefile│ │ └── src│ │ ├── main.c│ │ └── main.c~│ └── tools│ ├── inc│ ├── Makefile│ └── src│ ├── base64.c│ ├── md5.c│ └── tools.c└── tags13 directories, 16 files
这样组织项目源码要比之前合理一些,那这样怎么来写Makefile呢?我们可以在每个目录下写一个Makefile,通过最顶层的Makefile一层一层的向下嵌套执行各层Makefile。那么我们最顶层的Makefile简单点的话可以这样写:
# top Makefile for xxx all :>---$(MAKE) -C srctags:>---ctags -R clean :>---$(MAKE) -C src clean .PHONY : all clean tags 其中命令>---$(MAKE) -C src
就是进入src目录继续执行该目录下的Makefile。然后src目录下的Makefile在使用同样的方法进入下一级目录tools、main、ipc,再执行该目录下的Makefile。其实这样有些麻烦,我们可以直接从顶层目录进入最后的目录执行make。再加入一些伪目标完善下,我们的顶层Makefile就出来了:
# Top Makefile for C program# Copyright (C) 2014 shallnew \at 163 \dot com all :>---$(MAKE) -C src/ipc>---$(MAKE) -C src/tools>---$(MAKE) -C src/main tags:>---ctags -R help:>---@echo "===============A common Makefilefor c programs==============">---@echo "Copyright (C) 2014 liuy0711 \at 163\dot com">---@echo "The following targets aresupport:">---@echo>---@echo " all - (==make) compile and link">---@echo " obj - just compile, withoutlink">---@echo " clean - clean target">---@echo " distclean - clean target and otherinformation">---@echo " tags - create ctags for vimeditor">---@echo " help - print help information">---@echo>---@echo "To make a target, do 'make[target]'">---@echo "========================= Version2.0 =======================" obj:>---$(MAKE) -C src/ipc obj>---$(MAKE) -C src/tools obj>---$(MAKE) -C src/main obj clean :>---$(MAKE) -C src/ipc clean>---$(MAKE) -C src/tools clean>---$(MAKE) -C src/main clean distclean:>---$(MAKE) -C src/ipc distclean>---$(MAKE) -C src/tools distclean>---$(MAKE) -C src/main distclean .PHONY : all clean distclean tags help
当我们这样组织源代码时,最下面层次的Makefile怎么写呢?肯定不可以将我们上一节的Makefile(version 1.1)直接拷贝到功能模块目录下,需要稍作修改。不能所有的模块都最终生成各自的可执行文件吧,我们目前是一个工程,所以最后只会生成一个可执行程序。我们这样做,让主模块目录生成可执行文件,其他模块目录生成静态库文件,主模块链接时要用其他模块编译产生的库文件来生成最终的程序。将上一节Makefile稍作修改得出编译库文件Makefile和编译可执行文件Makefile分别如下:
# A Makefile to generate archive file# Copyright (C) 2014 shallnew \at 163 \dot com CFLAGS += -g -Wall -Werror -O2CPPFLAGS += -I. -I./inc -I../../include # SRC_OBJ = $(patsubst %.c, %.o, $(wildcard *.c))SRC_FILES = $(wildcard src/*.c)SRC_OBJ = $(SRC_FILES:.c=.o)SRC_LIB = libtools.a all : $(SRC_LIB) $(SRC_LIB) : $(SRC_OBJ)>---$(AR) rcs $@ $^>---cp $@ ../../libs obj : $(SRC_OBJ) # clean targetclean:>---$(RM) $(SRC_OBJ) $(SRC_LIB) distclean:>---$(RM) $(SRC_OBJ) $(SRC_LIB) tags *~ .PHONY : all obj clean disclean
==========================================================================
# A Makefile to generate executive file # Copyright (C) 2014 shallnew \at 163 \dot com CFLAGS += -g -Wall -Werror -O2CPPFLAGS += -I. -I./inc -I../../includeLDFLAGS += -lpthread -L../../libs -ltools -lipc # SRC_OBJ = $(patsubst %.c, %.o, $(wildcard *.c))SRC_FILES = $(wildcard src/*.c)SRC_OBJ = $(SRC_FILES:.c=.o) SRC_BIN = target_bin all : $(SRC_BIN) $(SRC_BIN) : $(SRC_OBJ) >---$(CC) -o $@ $^ $(LDFLAGS) obj : $(SRC_OBJ) # clean targetclean:>---$(RM) $(SRC_OBJ) $(SRC_BIN) $(SRC_BIN).exe distclean:>---$(RM) $(SRC_OBJ) $(SRC_BIN) $(SRC_BIN).exe tags*~ .PHONY : all obj clean disclean
最后在顶层执行:
# make cleanmake -C src/ipc cleanmake[1]: Entering directory`/home/Myprojects/example_make/version-3.0/src/ipc'rm -f src/ipc.o libipc.amake[1]: Leaving directory`/home/Myprojects/example_make/version-3.0/src/ipc'make -C src/tools cleanmake[1]: Entering directory `/home/Myprojects/example_make/version-3.0/src/tools'rm -f src/base64.o src/md5.o src/tools.o libtools.amake[1]: Leaving directory`/home/Myprojects/example_make/version-3.0/src/tools'make -C src/main cleanmake[1]: Entering directory`/home/Myprojects/example_make/version-3.0/src/main'rm -f src/main.o target_bin target_bin.exemake[1]: Leaving directory`/home/Myprojects/example_make/version-3.0/src/main'[root@localhost version-3.0]# makemake -C src/ipcmake[1]: Entering directory`/home/Myprojects/example_make/version-3.0/src/ipc'cc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/ipc.osrc/ipc.car rcs libipc.a src/ipc.ocp libipc.a ../../libsmake[1]: Leaving directory `/home/Myprojects/example_make/version-3.0/src/ipc'make -C src/toolsmake[1]: Entering directory`/home/Myprojects/example_make/version-3.0/src/tools'cc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/base64.osrc/base64.ccc -g -Wall -Werror -O2 -I. -I./inc -I../../include -c -o src/md5.o src/md5.ccc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/tools.osrc/tools.car rcs libtools.a src/base64.o src/md5.o src/tools.ocp libtools.a ../../libsmake[1]: Leaving directory`/home/Myprojects/example_make/version-3.0/src/tools'make -C src/mainmake[1]: Entering directory`/home/Myprojects/example_make/version-3.0/src/main'cc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/main.osrc/main.ccc -o target_bin src/main.o -lpthread -L../../libs -ltools-lipcmake[1]: Leaving directory`/home/Myprojects/example_make/version-3.0/src/main'#
最后生成了可执行程序文件。这样的话一个工程的各个模块就变得独立出来了,不但源码分开了,而且各自有各自的Makefile,并且各个功能模块是可独立编译的。
我们发现顶层Makefile还有可以改进的地方,就是在进入下一层目录是要重复写多次,如下:
>---$(MAKE) -C src/ipc>---$(MAKE) -C src/tools>---$(MAKE) -C src/main
每增加一个目录都要在多个伪目标里面加入一行,这样不够自动化啊,于是我们想到shell的循环语 句,我们可以在每条规则的命令处使用for循环。如下:
DIR = srcSUBDIRS = $(shell ls $(DIR)) all :>---@for subdir in $(SUBDIRS); \>---do $(MAKE) -C $(DIR)/$$subdir; \ >---done
这样懒人有可以高兴很久了。不过还有问题:
上面for循环会依次进入系统命令ls列出的目录,但我们对每个目录的make顺序可能有要求,在该项目当中,main目录下的Makefile必须最后执行,因为最终的链接需要其他目录编译生成的库文件,否则会执行失败。并且在当前的Makefile中,当子目录执行make出现错误时,make不会退出。在最终执行失败的情况下,我们很难根据错误的提示定位出具体是是那个目录下的Makefile出现错误。这给问题定位造成了很大的困难。为了避免这样的问题,在命令执行错误后make退出。
所以将刚才的Makefile修改为如下
DIR = srcSUBDIRS = $(shell ls $(DIR)) all :>---@for subdir in $(SUBDIRS); \>---do $(MAKE) -C $(DIR)/$$subdir || exit 1; \ >---done
这样在执行出错时立马退出,但这样还是没有解决问题,编译错误还是会出现。那怎么解决呢?
我们可以通过增加规则来限制make执行顺序,这样就要用到伪目标,对每一个模块我们都为他写一条规则,每个模块名称是目标,最后需要执行的模块目标又是其他模块的目标,这样就限制了make顺序。在执行到最后需要执行的目标时,发现存在依赖,于是先更新依赖的目标,这样就不会出错了。并且这样的话,我们还可以对指定模块进行编译,比如我只修改了tools模块,我只想看看我修改的这个模块代码是否可以编译通过,我可以在编译时这样:
# make toolsmake -C src/toolsmake[1]: Entering directory`/home/Myprojects/example_make/version-2.1/src/tools'cc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/base64.o src/base64.ccc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/md5.osrc/md5.ccc -g -Wall -Werror -O2 -I. -I./inc-I../../include -c -o src/tools.osrc/tools.car rcs libtools.a src/base64.o src/md5.o src/tools.ocp libtools.a ../../libsmake[1]: Leaving directory`/home/Myprojects/example_make/version-2.1/src/tools'#
还有另外一种方法也可以解决此问题,就是手动列出需要进入执行的模块名称(这里就是目录了),把最后需要执行的模块放在最后,这样for循环执行时最后需要编译链接的模块就放在最后了,不会像我们之前那样make是按照使用系统命令ls列出模块目录的顺序来执行。ls列出目录是按照每个目录的名称来排序的,我们总不能要求写代码的时候最后执行的模块的名称必须是以z开头的吧,总之不现实。
我们的顶层Makefile又进化了,也是这一节最终Makefile:
# Top Makefile for C program# Copyright (C) 2014 shallnew \at 163 \dot com DIR = srcMODULES = $(shell ls $(DIR))# MODULES = ipc main tools all : $(MODULES) $(MODULES):>---$(MAKE) -C $(DIR)/$@ main:tools ipc obj:>---@for subdir in $(MODULES); \>---do $(MAKE) -C $(DIR)/$$subdir $@; \>---done clean :>---@for subdir in $(MODULES); \>---do $(MAKE) -C $(DIR)/$$subdir $@; \>---done distclean:>---@for subdir in $(MODULES); \>---do $(MAKE) -C $(DIR)/$$subdir $@; \>---done tags:>---ctags -R help:>---@echo "===============A common Makefilefor c programs==============">---@echo "Copyright (C) 2014 liuy0711 \at 163\dot com">---@echo "The following targets aresupport:">---@echo>---@echo " all - (==make) compile and link">---@echo " obj - just compile, withoutlink">---@echo " clean - clean target">---@echo " distclean - clean target and otherinformation">---@echo " tags - create ctags for vimeditor">---@echo " help - print help information">---@echo>---@echo "To make a target, do 'make[target]'">---@echo "========================= Version2.0 =======================" .PHONY : all clean distclean tags help
三 : 吴大真:美丽从“头”开始
□采写:《珠江晚报》记者 张泊宁 □摄影:本报记者 朱 习四 : 从头开始
小学五年级的时候,我被老爸送去学跆拳道。开始去的时候都是白带,每天就练最简单的腿法和最基础的步法。
每天如此。枯燥,无味。
那时候就特别羡慕那些高级色带的师兄师姐,不是羡慕他们学的东西有趣,而是羡慕他们腰间系着的色带。蓝带,红带,红黑带,在那时的我眼里是那么的具有吸引力。
于是我开始带着一点认真地学习跆拳道,不是因为喜欢,只是单纯为了考级,拿腰带。
揣着忐忑不安的心,踏上了考场,听着教练报出的内容,麻木地做出动作。
第一次拿到考级证书,第一次拿到系上黄腰带。
第二次踏上考场,顺利通过黄绿带的考级。
第三次走上考场,自信的做出动作,通过绿带的考级。
在拿到绿带的那一刻,很开心,觉得当初的目标已经慢慢开始实现了,要继续努力,向黑带的方向努力。。
汗水从发梢低落,道服被浸湿,大口地呼吸新鲜空气。
很累,但是很充足,很快乐。从一开始的什么也不会,什么也不懂,到现在对跆拳道的认识,了解和慢慢地得应手。我突然发现,我对跆拳道的学习,不仅是为了虚荣心,跟多的是喜爱和尊重。尽管是喜爱,但考级拿黑带依旧是我学习跆拳道的一个重要原因。因为在学校,所以跆拳道社团收费不高,练的人很多,但却大多都是白带,黄带和少数的高级色带和黑带。每次走进道馆,换上道服,系上腰带,踏上垫子,无一都能听到别人的议论——我的腰带。“那个女孩是蓝红的哎!””是啊,好厉害哦!”每次听到这样的言论,我的心情总会不由得愉悦,嘴角上扬,享受同学对我的赞叹。但其实我明白,蓝红带其实并不算什么,我学了将近两年的跆拳道,考到蓝红带是很正常的事。即便如此,我也只是笑笑,并不否定。新的
初二:吕
五 : 从头开始
习惯了一个人的日子,酷热的夏天,一遍又一遍的吹着空调,身上却盖着厚厚的被子,看着无聊的电视,看到里面的主人公因为爱情而不顾一切,这时让我想到这几天看过的小说,里面的每一部小说的情节几乎都有着相同的结局,那就是——王子和公主过上了幸福的生活。中间偶尔会有很煽情的部分,那时的我也会随之落下咸咸的泪水,看过之后,回味当时的情节,会让我觉得自己很可笑,看书从不流泪的我,居然做出了违背常理的事。其实,小时侯,我就有个单纯的愿望,长大后找个爱自己的人,然后为他穿白纱,当新娘。16岁的我很庆幸遇到了两个爱自己的人,不知道那时算不算爱,可我还是没有选择,而是选择了学习,我知道,这个决定会得到许多人的认同,但我心里总是有什么放不下,我不后悔我的选择,从不后悔,只是有些遗憾,所以我便适着遗忘,因为曾经有人告诉我,失去了并再也不能拾起的时候,就必须选择遗忘。
马上,我将重整行装踏上漫长而又充满竞争的国度——高中。我曾经惧怕上高中,怕我会辜负父母的期望,那样我会觉得自己罪孽深重。但如果有一天,让我放弃上高中,去选择一所职业高中,学一门技术,然后自谋生路,我想,那时的我一定会不甘心的。小时侯不仅有单纯的愿望,还有远大的理想。我想长大以后考上一所自己理想中的大学,完成自己的大学梦。成长的阶段,我受很多小说的影响,书中的大学生活是多么的美好啊。所以,我才鼓起勇气,背上行囊走进高中,上大学就成了上高中的唯一支柱。既然为了梦想,要努力,那么就真的应该放弃一切,抛开一切,从头开始了!
曾经那凝视心扉的泪眼,到现在才明白那只是无语的沉默,不是吗?
现在,我应该忘记“曾经”留下的那道道无痕的伤。虽然,我仍无法忘记那个夜晚,有风,有云,有星星,有残月,有我们的约定和那海誓山盟的誓言,但这一切我都会将它埋在心灵的最深处。明天,我的明天,云淡风轻的日子,蓝天白云下,阳光的照耀下,有个扎着马尾辫的女孩在风中轻舞,放飞梦想,放飞心中的希望……
本文标题:从头开始-从头开始 运动发带打造街头运动风
61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1