opencv java api 中文:Linux C语言开发 动态链接库以及静态链接库编程简单介绍

来源:百度文库 编辑:偶看新闻 时间:2024/04/19 14:39:10

Linux C语言开发 动态链接库以及静态链接库编程简单介绍

分类: Linux C语言 2010-05-09 11:49 606人阅读 评论(1) 收藏 举报

差不多可以认为,每个程序都链接到一个或几个库上。任何一个使用了C函数(诸如printf等)都须链接到C运行时库。如果你的程序具有图形界面(GUI),它将被链接到窗口系统的库。如果你的程序使用了数据库,数据库供应商会提供给你一些简化访问数据库的库。
在这些情况中,你必须作出选择:静态(statically)还是动态(dynamically)地将程序链接到库上。如果你选择了静态链接,程序体积可能会更大,程序也会比较难以升级,但是可能相对而言比较易于部署。如果你选择动态链接,则程序体积会比较小、易于升级,但是部署的难度将会有所提高。本节中我们将介绍静态和动态两种链接方法,仔细比较它们的优劣,并提出一些在两者之间选择的简单的规则。

 

>>>>静态链接库

静态链接库(static library)也被成为存档文件(archive),是一个存储了多个对象文件(object frile)的单一文件。编译器在得到一个存档文件后,会在这个存档文件中寻找需要的对象文件,将其提取出来,然后与连接一个单独的对象文件一样将其连接到你的程序中。

    你可以使用 ar 命令创建存档文件。传统上,存档文件使用.a最为后缀名,以便与.o的对象文件区分开。下面的命令可以将sub.o add.o合并成一个libmyfun.a:

ar cr libmyfun.a sub.o add.o

 

当链接器在命令行参数中获取到一个存档文件时,它将在其中搜索所有之前已经被引用而没有被定义的符号(函数或变量)的定义。定义了这些符号的对象文件将从存档中被提取出来,链接到新程序执行文件中。因为链接器会在读取命令行参数的过程中一遇见存档文件就进行解析,通常将存档文件放在命令行参数的最后最有意义

 

举例:

/*sub.c*/

int sub(int a, int b)

{

    return a - b;

}

 

/*add.c*/

int add(int a, int b)

{

   return a + b;

}

 

下面将sub.c 与 add.c编译为.o文件:

gcc -c sub.c -o sub.o

gcc -c add.c -o add.o

将sub.o add.o合并为存档文件(静态库):

ar cr libmyfun.a add.o sub.o

 

编写一个测试程序来测试此静态库:

/*test.c*/

#include

int main(int argc, char* argv[])

{

    printf("1 + 2 = %d/n", add(1, 2));

    printf("1  - 2 = %d/n", sub(1, 2));

    return 0;

}

 

下面为test.c的makefile:

 

SRC = test.c
OBJECTS = test.o
TARGET = test

CC = gcc
CFLAG = -static
IFLAG = ./libmyfun.c

$(TARGET):$(OBJECTS)
 $(CC) $(CFLAG) -o $(TARGET) $(OBJECTS) $(IFLAG)
.c.o:
 $(CC) -c $<
clean:
 rm -f *.o
 rm *.bak

make 并运行 ./test得到期望的结果。

 

 

 

 

>>>>>>>>>>>.动态链接库

 

共享库(shared library,也被称为共享对象shared object或动态链接库dynamically linked library)在某种程度上与由一组对象文件生成的打包文件相当类似。不过,两者之间的区别也是非常明显的。最本质的区别在于,当一个共享库被链接到程序中的时候,程序本身并不会包含共享库中出现的代码。程序仅包含一个对共享库的引用。当系统中有多个程序链接到同一个共享库的时候,它们都将引用这个共享库而不是将代码直接包含在自身程序中——正因为如此,我们说这个库被所有这些程序“共享”。
第二个重要的区别在于,共享库不仅仅是对象文件的简单组合。当使用的时候,链接器会从中寻找需要的部分进行链接,以匹配未定义的符号引用。而当生成共享库的时候,所有对象文件被合成为一个单独的对象文件,从而使链接到这个库的程序总能包含库中的全部代码,而不仅仅是所需要的部分。
要创建一个共享库,你必须在编译那些用于生成共享库的对象时为编译器指定–fPIC选项。
gcc –c –fPIC test1.c

 

如果是多个文件可以用如下方法实现动态库的创建

编译各个.o文件
g++/gcc     -c   -fPIC   -o   library1.o   library1.cpp      
g++/gcc     -c -fPIC   -o   library2.o   library2.cpp      
g++/gcc     -c   -fPIC   -o   libraryN.o   libraryN.cpp
连接成动态库:           
g++/gcc   -g   -shared   -o libmydll.so lib1.0 lib2.0 .... libN.o

 

 

以上面“静态链接库”为例,生成动态库的步骤如下:

gcc -c  -fPIC -o sub.o sub.c(或者: gcc -c -fPIC sub.cpp -o sub.o)

gcc -c -fPIC -o add.o add.c(或者: gcc -c -fPIC add.cpp -o add.o)

连接成动态库:

gcc -shared -o libmyfun.so add.o sub.o