• Linux make 和 Makefile 详解

    1. 前言 如果你有手动从源码编译过linux应用程序的经历,那么你肯定不会对”./configure“,”make”,”make install”这些命令感到陌生。下面我们就来探索一下这个过程中的每一都发生了什么。 在Linux系统环境中使用GNU的make工具可以很方便地构建和编译一个大型的工程,整个工程的编译只需要一个命令”make”就可以完成编译、链接和运行。不过在使用”make”命令之前,我们需要完成一个叫做”Makefile”文件的编写,这个文件详细描述了我们整个工程该如何取编译、链接以及最后生成一个可执行的文件,以及这个过程中所需要依赖的文件和其他工具软件。 在介绍make和Makefile之前,我们来补充说明一下linux下一个简单C语言源程序的编译、链接的过程。 编译: 编译就是把文本形式的源代码翻译称为及其语言形式的目标文件的过程。 链接: 链接就是把目标文件和使用到的库文件进行组织,最终形成可执行代码的过程。 整个编译和链接的过程的图解如下: 从上图可知,整个代码编译的过程分为编译和链接两个阶段,其中编译对应的是大括号对应的部分,其余则是链接过程。 在这里我们还要特别说明一下linux中的库文件! 库: 库是一组预先编译好的函数的集合,这些函数都是按照可重用的原则编写的。 在linux中库文件可以分为静态库和共享库(有的地方也叫做动态库)。 静态库: 它也称为归档文件(archive file),按照惯例它们的文件都是以”.a”结尾,比如标准C语言函数库”/usr/lib/libc.a”。静态库在程序链接时会使用,链接器会将程序中使用到函数的代码从静态库文件中拷贝到应用程序中。一旦链接完成,在执行程序的时候就不需要静态库了。由于每个使用静态库的应用程序都需要拷贝所用到函数的代码,所以静态链接生成的可执行文件都会比较大。 共享库:...


  • Python 学习笔记(3)

    1. 模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。 使用模块的好处? 最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。 使用模块还可以避免函数名和变量名冲突。相同名字的函数名和变量名可以存在于不同的模块中,因此,我们在编写模块时,不必担心模块名会与其他模块冲突。但是,尽量不要与Python中的内置函数名冲突。Python内置函数。 但是你也许会想到 ,如果两个人编写了相同的模块名,那么模块名冲突了怎么办?Python为了避免模块名冲突,引入了包(Package)。 举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。 现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放: 引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。 请注意,在每一个包目录下都会有有一个叫做__init__.py的文件,这个文件必须存在,否则Python就把这个目录当成一个普通的目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。 类似的,可以有多层目录,组成多级层次的包结构。比如,下面的目录结构: 文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。 mycompany.web也是一个模块,请指出该模块对应的.py文件。 mycompany.web模块对应的文件就是mycompany.web目录下的__init__.py文件。 1.1 模块使用 下面我们就以Python中的内建模块sys为例,编写一个hello模块,由此来讲解Python中模块文件的编写规范。 #!/usr/bin/env...


  • Python 学习笔记(2)

    1. 函数 .1 函数调用 Python中内置了许多函数,在python程序中我们可以直接通过函数名调用,例如: abs,chr,ord等等。我们也可以从Python的官方文档中查看到内置函数的具体信息:https://docs.python.org/2/library/functions.html#abs Python中函数的函数名其实本质上是一个指向函数对象的引用,完全可以把函数名赋值给一个变量,这相当于给函数换了个“别名”,例如: >>> a = abs >>> a(-1) 1 >>> a(100) 100 在使用Python中内置的函数时,需要根据函数的参数定义,传入合适的参数。 1.2 函数定义...


  • Python 学习笔记(1)

    1. Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言[1]。 Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。 除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。 总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。 那Python适合开发哪些类型的应用呢? 首选是网络应用,包括网站、后台服务等等; 其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等; 另外就是把其他语言开发的程序再包装起来,方便使用。 最后说说Python的缺点: 任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。 第二个缺点就是代码不能加密。如果要发布你的Python程序,实际上就是发布源代码,这一点跟C语言不同,C语言不用发布源代码,只需要把编译后的机器 码(也就是你在Windows上常见的xxx.exe文件)发布出去。要从机器码反推出C代码是不可能的,所以,凡是编译型的语言,都没有这个问题,而解 释型的语言,则必须把源码发布出去。 2....


  • Ubuntu 14.04下手动安装Firefox的flash插件

    前言 以前自己一直使用的是Google的Chrome浏览器,主要是因为Chrome浏览器很简洁并且响应速度快。但是后来当自己想在不同的系统平台下的Chrome浏览器同步自己保存的书签时就遇到了一个很让人蛋疼的问题,Chrome只支持Google账户同步,而在俺们大天朝,Google是黑户,如果不通过某种方法是根本无法享受到Google的一系列服务,包括Chrome的书签同步功能。山不转水转,我就重新寻找一个可以在多平台进行书签同步的浏览器了,这不,Firefox就出现在我的世界中了。 用了一段时间的Firefox感觉还不错,功能也很全面,还有很多的插件扩展浏览器的功能,关键它也支持不同平台的书签同步功能。但是,但是,但是,直到有一天当我打开Firefox想看视频时,它却给我弹出这个东东。 好不,不懂只能文度娘了。在度娘上找到了“病因”,原来是Firefox上面的flash插件版本太低不安全了,尼玛,老子在其他浏览器上都没遇到过这种问题啊,没办法,这不得解决嘛。后来的后来,我几乎每个月都能碰见这种情况一会,以前找到的解决方案也忘了,所以今天就把这法子给记下来,以备后用。 在Ubuntu下这种插件也没有apt包可以直接安装,只能自己手动下载安装,下面就详细说明下整个安装过程。 1. 下载flash插件 flash 插件的官方下载地址为: https://get.adobe.com/flashplayer/?loc=cn 然后选择.tar.gz压缩文件格式下载,如下所示: 2. 解压文件 将下载好的flash插件压缩包,解压到一个文件夹中,如下所示: 3. 将解压出来的libflashplayer.so拷贝到/usr/lib/mozilla/plugins/下 $ sudo cp libflashplayer.so...