对于各种类型的成语员,共享库是不可少的元素了,一般的库就是指已经编译成熟可以供大家使用的代码了,他一般具有一些通用的功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例如一个数据库服务器的接口,就像MySQL。

 Linux使用GCC编译C语言共享库心得[多图]图片1

大部分大型的软件项目都会包含若干组件,其中一些你发现可以用在其他项目中,又或者你仅仅出于组织目的将不同组件分离出来。当你有一套可复用的并且逻辑清晰的函数时,将其构建为一个库会十分有用,这样你就不将这些源代码拷贝到你的源代码中,而且每次都要再次编译它们。除此之外,你还可以保证你的程序各模块隔离,这样你修改其中一个模块时也不会影响到其他的模块。一旦你写好一个模块并且通过测试,你就可以无限次地安全地复用它,这可以节省大量时间和麻烦。

 

构建静态库太简单了,对此我们几乎不会遇到什么问题。我不想说明如何构建静态库。在此我只讨论共享库,因为对大多数人来说它更加难懂。

 

在我们正式开始前,让我们列一下纲要来了解从源代码到运行程序之间发生了什么:

    预处理:这个阶段处理所有预处理指令。基本上就是源代码中所有以#开始的行,例如#define和#include。编译:一旦源文件预处理完毕,接下来就是编译。因为许多人提到编译时都是指整个程序构建过程,因此本步骤也称作“compilation proper”。本步骤将.c文件转换为.o文件。连接:到这一步就该将你所有的对象文件和库串联起来使之成为最后的可运行程序。需要注意的是,静态库实际上已经植入到你的程序中,而共享库,只是在程序中包含了对它们的引用。现在你有了一个完整的程序,随时可以运行。当你从shell中启动它,它就被传递给了加载器。加载:本步骤发生在你的程序启动时。首先程序需要被扫描以便引用共享库。程序中所有被发现的引用都立即生效,对应的库也被映射到程序。

 

第3步和第4步就是共享库的奥秘所在。

现在,开始我们一个简单的示例。

 

 foo.h:

#ifndef foo_h__#definefoo_h__externvoidfoo(void);#endif//foo_h__

 

foo.c:

Linux使用GCC编译C语言共享库心得[多图]图片2
#include <stdio.h>voidfoo(void)
{
    puts("Hello, I'm a shared library");
}
Linux使用GCC编译C语言共享库心得[多图]图片2