linux之动态库与静态库

来源:互联网 发布:网页信息采集软件 编辑:程序博客网 时间:2024/06/08 15:46

使用动态库时,系统会检查该动态库是否已经加载,如果已经加载,则直接映射即可,如果没有加载,那么会加载之后再映射。

如果动态库中有全局变量,那么该全局变量对于不同的进程来说,是相互独立和隔离的。

链接静态库时,静态库被一起编译进可执行程序,运行时不再依赖静态库。

动态库编译:gcc -fpic -shared a.c b.c -o libtest.so链接动态库gcc main.c -ltest -L. -o mybin运行程序时export LD_LIBRARY_PATH=.或者将动态库拷贝到/usr/lib./mybin静态库打包:ar rcs libtest.a a.o b.o链接库时,如果有同名的动态库和静态库,默认优先动态库,如果要链接静态库,那么使用-static,比如gcc a.c -lmylib -static通过以下方式可以指定某些库使用静态链接,而某些库使用动态链接-Wl,-Bstatic -ltest -Wl,-Bdynamic -ltest2

1.linux下生成动态库
(1)建立一个文件,lib.c,该文件的内容如下,然后终端执行命令:gcc -shared -fpic -o libmylib.so lib.c;
其中 -shared -fpic是必选命令; libmylib.so根据标识符规则自命名, lib.c是刚建立的文件名;该命令执行后,当前的目录下就会有一个名为:libmylib.so的动态链接库文件;

/*************************************************************************    * File Name: lib.c    * Author: lixiaogang    * Mail: 2412799512@qq.com     * Created Time: 2017年06月02日 星期五 20时11分08秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>int a;void hoge(){    printf("hello world.\n");}

(2)再在当前目录下建立一个test.c;该文件里面的内容如下;接着执行gcc test.c -lmylib;(注意:不用写libmylib.so中的lib和.so后缀);此时编译会报错,并提示:

/usr/bin/ld: cannot find -lmylibcollect2: error: ld returned 1 exit status

找不到库,因为linux默认是去PATH环境里找,但是PATH环境里面没有该库,所以报错;

/*************************************************************************    * File Name: test.c    * Author: lixiaogang    * Mail: 2412799512@qq.com     * Created Time: 2017年06月02日 星期五 20时24分33秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>/*使用了动态库中的全局变量和函数*/extern int a;extern void hoge();int main(int argc,char *argv[])  {    int a = 66;    printf("a = %d\n",a);    hoge();    return 0;  }

(3)接着执行命令:gcc test.c -L. -lmylib;(L表示增加收索路径,其中的“.”表示是在当前的位置收索);这时候不会提示错误了,但是执行./a.out的时候,仍然会报错,如下:原因如上;

./a.out: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

(4)执行命令:export LD_LIBRARY_PATH=.;注意PATH和=之间没有空格,接着./a.out 便可成功得出结构:

a = 66hello wrold.

结论:-shared -fpic是必须写的,语法规定就这么用;编译出来的动态链接库一般前缀要加lib,后缀要加.so(so意为:shared object)export LD_LIBRARY_PATH=.其中export是设置环境变量;这样设置的环境变量只有在该终端中有效,在另外一个终端中就无效了;若希望其永久生效,可以将其写在

/etc/profile文件下面,这样每次系统启动的时候就会自动生效

(2)静态链接库
文件仍然采用上面lib.c和test.c;首先第一步为:gcc -c lib.c;此时目录下会生成一个lib.o的文件;接着执行命令
ar rcs lib_testlib.a lib.o,这时会生成一个名为:

lib_testlib.a

的文件;再执行命令:gcc test.c -l_testlib -L. -static便可成功的生成静态库的链接;
执行:./a.ouot得结果为:

a = 66hello world.

这里值得注意的是,若当前的目录下即有动态链接库,又有动态链接库的话,则默认是去找动态链接库,若要显示的声明去找静态链接库的时候,加上-static;

原创粉丝点击