平时我们写程序都必须 include 很多头文件,因为可以避免重复造轮子,软件大厦可不是单靠一个人就能完成的。但是你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了!
库有两种,一种是 静态链接库,一种是 动态链接库,不管是哪一种库,要使用它们,都要在程序中包含相应的 include 头文件。我们先来回顾一下程序编译的过程。如下图:
1. 静态链接库
什么是静态链接呢?即在链接阶段,将源文件中用到的库函数与汇编生成的目标文件.o合并生成可执行文件。该可执行文件可能会比较大。这种链接方式的好处是:方便程序移植,因为可执行程序与库函数再无关系,放在如何环境当中都可以执行。
缺点是:文件太大,一个全静态方式生成的简单print文件都有857K。而动态链接生成的一样的可执行文件却只要8.4K。
文件内容很简单,就是一个printf(“hello world!\n”);
因为包含库文件stdio,所以静态编译出的文件很大。如果你想尝试的话,可以这样编译:
gcc -static -o print print.c
在linux中,静态库为lib*.a,动态库为lib*.so。
1.1 codeblocks下建立c++静态链接库项目
首先建立一个静态链接库项目,添加代码如下:
第二,编译项目,此时在项目目录下就会生成静态链接库文件.
第三,新建一个控制台测试项目,调用刚才的静态链接库.
① 编译测试项目.
② 将D:\tools_jingtai\bin\Debug目录下的libtools_jingtai.a和libtools_jingtai.dll拷贝到D:\0504jt\bin\Debug目录下,将D:\tools_jingtai\tools_jingtai.h拷贝到D:\0504jt目录下.
③ 编写代码如下:
程序运行后结果如下:
2. 动态链接库
我们知道静态链接的话,文件会很大,往往实现很小的一个功能就需要占用很大的空间,而且每次库文件升级的话,都要重新编译源文件,很不方便。具体下面如下:
对于静态编译的程序1和程序2,都应用库staticMath。在内存中就又两份相同的staticMath目标文件,很浪费空间,一旦程序数量过多就很可能会内存不足。
这么大的内存才只能运行这几个程序,实在不甘心。
这样就又了动态库发挥威力的地方了。我们来看看动态链接的结果:
我们看到在这种模型中,两个程序只应用一个库,这个目标文件在内存中只有一份,供所有程序使用。
2.1 codeblocks下建立c++动态链接库项目
首先创建动态链接库项目tools_dll,如下:
第二,编辑项目.
第三,新建控制台测试项目0504dll,编译后将D:\tools_dll\bin\Debug目录下的libtools_dll.a和tools_dll.dll拷贝到D:\0504dll\bin\Debug目录下,将D:\tools_dll下的tools_dll.h拷贝到D:\0504dll下.
接着编辑项目的build options如下:
第四,编写测试代码如下:
第五,运行结果如下:
可见,100000个数的冒泡排序,c++需要25s左右.