c,c++链接库

平时我们写程序都必须 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++静态链接库项目

首先建立一个静态链接库项目,添加代码如下:

0504c1

0504c2

0504c3

0504c4

0504c5

0504c6

0504c7

0504c8

0504c9

0504c10

第二,编译项目,此时在项目目录下就会生成静态链接库文件.

第三,新建一个控制台测试项目,调用刚才的静态链接库.

① 编译测试项目.

② 将D:\tools_jingtai\bin\Debug目录下的libtools_jingtai.a和libtools_jingtai.dll拷贝到D:\0504jt\bin\Debug目录下,将D:\tools_jingtai\tools_jingtai.h拷贝到D:\0504jt目录下.

③ 编写代码如下:

0504c11

0504c12

0504c13

程序运行后结果如下:

0504c14

2. 动态链接库

我们知道静态链接的话,文件会很大,往往实现很小的一个功能就需要占用很大的空间,而且每次库文件升级的话,都要重新编译源文件,很不方便。具体下面如下:
0504c15

对于静态编译的程序1和程序2,都应用库staticMath。在内存中就又两份相同的staticMath目标文件,很浪费空间,一旦程序数量过多就很可能会内存不足。
这么大的内存才只能运行这几个程序,实在不甘心。
这样就又了动态库发挥威力的地方了。我们来看看动态链接的结果:

0504c16

我们看到在这种模型中,两个程序只应用一个库,这个目标文件在内存中只有一份,供所有程序使用。

2.1 codeblocks下建立c++动态链接库项目

首先创建动态链接库项目tools_dll,如下:

0504cpp1

0504cpp2

0504cpp3

0504cpp4

0504cpp5

第二,编辑项目.

第三,新建控制台测试项目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如下:

0504cpp6

第四,编写测试代码如下:

0504cpp7

第五,运行结果如下:

0504cpp8

可见,100000个数的冒泡排序,c++需要25s左右.

发布了14 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xxuffei/article/details/90022139