去年买了《LInux网络编程》这本,没想到一放就是半年的时间了,惭愧啊!当年的雄心壮志都去哪了?当年买书就想着对LInux来一个深入了解,没想到自己现在都做Linux这个方向快有一年了,却仍然对Linux了解不多,特别是Linux网络方面的知识~~~~
好,废话不多说,从今天开始,每天积累一点,厚积才能薄发,磨刀不误砍柴工。工资赶快涨~~~~~~涨~~~~~。今天先简单描述吧,博客虽然开通很久,真没写过几篇文章,姑且用来写流水文章吧,呵呵~~
1991年,Linux开始诞生了,到2011年,Linux的版本从2.6直接蹦到了3.0,据说这个没什么大意义,来到了3.0的时代,只是纯属纪念Linux发布20周年而已。当然在linux之前,存在unix,是贝尔实验室开发出来,但它存在收费。然后,Minix出来了,是unix的克隆操作系统,这个系统有详细的书来描述它的原理,所以当时很多人在学习它,包括Linus本人。最后,Linux诞生了。Linux也是unix的克隆操作系统,它和uinix有很好的兼容性。
linux的从诞生到高速发展确实受不了下面5个方面:unix,minix,GNU计划、POSIX标准和网络。个人觉得在网络的时代的今天,linux的发展确实少不了网络,这也是它的强大之处。那么,问题来了了,GNU是什么?一直学习嵌入式Linux,对GUN总是不深入了解,今天也简单描述下吧。
GNU计划:它的目标是创建一套完全自由的操作系统,保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。即“反版权”(或称Copyleft)概念。1991年Linus Torvalds编写出了与UNIX兼容的Linux操作系统内核并在GPL条款下发布。
Ctrl + R 和nG的使用:这两个命令一直很少使用,这里要记住以下:Ctrl + R:撤销u的操作,nG就是跳到第几行。
GCC编译器工具集:GCC是GNU下的编译工具集,其中gcc,g++分别能编译c和c++。GCC能很方便的进行交叉编译,因为只有定义好目标机器的定义规则,便可试下交叉编译。GCC里面的工具在使用的过程中,存在默认的搜索头文件和库的路径。gcc的常用参数:-D:定义不同的宏,-g:包含调试信息,-static:使用静态库进行连接,-On:不同的优化等级,一般n设置为2即可,-c:编译不链接,-E:只进行预编译,-S:生成汇编代码,-Wall:开启所以警告。
静态库和动态库的生成:
静态库一般以.a为后缀,其实就是obj文件的集合,为快速编译代码,可以把少修改的代码编译为静态库。一般使用ar这个命令。如生成的镜头库命令:ar -rcs libtest.a test.o:注意:静态库的名字为libtest.a,如果调用静态库的方式不是:gcc =o test main.c -L./ -lstr的方式,库名不一定带前缀lib。
动态链接库:动态链接库是程序在运行的时候加载的库。动态库的安装其实就是拷贝到/usr/lib、lib或者/usr/local/lib里面。动态链接库的名字有别名,真名和链接命令。一般后缀为.so。 -shared告诉编译器生成一个动态链接库。若同一路径下存在同名的静态库和动态库,默认加载动态库。动态库的路径可以添加到/etc/ld.so.conf文件里面,那么编译器能找到对应的链接库。动态链接库的管理命令:ldconfig:可以查看当前的默认路径下的链接库以及加载某个添加链接库到ld.so.cache中去。ldconfig -p可以查看当前系统存在哪些动态链接库。注意:运行ldconfig之后,将刷新ld.so.cache缓存文件。
动态加载库:动态加载库和动态链接库是不同的,动态链接库在程序启动是要找到动态库找到库函数,而动态加载库可以用在函数中来动态加载,主要的函数是:dlopen()、dlerror()、dlsym()和dlclose()。dlsym函数在动态加载库里面找到需要的函数库,然后可以调用该函数,当然,调用之前使用dlerror函数判断是否打开错误。
Makefile:从接触linux以来,总是对Makefile不懂,很多时候根据没用上,就是能用上,也是拷贝其他的参考即可。不过,今天还是简单描述一下吧,毕竟工作中还是经常遇到,特别是跳槽的时候,面试会少不了的哦,哈哈~~~也许是自信心不足吧,如今都没勇气跳槽,只能暂时拿点小工资了,想si的心都有了~~
好了,那么Makefile是什么?Makefile文件提供了一种管理工程的功能,通过make命令,很方便的对整个工程的编译,而避免了使用手动来编译庞大的工程文件。其实,make命令也是通过读取Makefile或者makefile文件,从里面读取编译规则来编译工程。Makefile或者makefile文件其实就是告诉make命令,生成目标文件需要的材料已经怎么样去生成。Makefile的规则是:
目标:依赖文件
(这里必须是TAB键)操作命令,TAB告诉make这个一个命令来的。
例如:
all:main.o hello.o
$(CC) -c $< -o hellotest
则会对mian.c和hello.c文件都运行$(CC) -c $< -o hellotest这个命令。对于不同的源文件,$<对应着不同的值,所以称为自动变量的原因吧。对于目标文件,只有$@和$*了,而$@比较常用。
当然,一个Makefile文件里面可以存在多条规则,不同的规则直接可以相互嵌套,相互调用。如果make不带参数,默认执行第一条规则。在Makefile里面可以使用的变量分为三种:1、自定义变量,引用为$(test),2、预定义变量:也就是系统里面默认变量,如:CC,AR,CFLAGS等。3、自动变量:其实启动变量是在不同的规则里面的值是不一样的,它能自动变化的。比如:$*,$+,$<,$?,$@,$^这几个自动变量。关于更新详细的总结,我觉得放置在下一篇文章里面去。
递归调用make:用在多目录下的程序开发。比如
add:
cd add && $(MAKE)或者$(MAKE) -C add都是代表先进入add目录,然后使用make命令解析add目录下的Makefile的规则。
终于描述完了,第一次写这么长的总结,还真不容易啊。刚进入嵌入式linux这行的时候,有个前辈就告诉我,每个人学习嵌入式linux都有自己的一套方法,别人的方法不一定适合你,适合自己的方法就是最好的方法。2015,路依旧很长~~