制作动态库并使用

来源:互联网 发布:逻辑回归 知乎 编辑:程序博客网 时间:2024/05/21 17:52

1、制作动态库
第一步:demo.c demo.h

/* demo.c */#include <stdio.h>void func1(void){    printf("func1 in demo.c.\n");}int func2(int a,int b){    printf("func2 in demo.c.\n");    return a+b;}/* demo.h */void func1(void);int func2(int a, int b);

第二步:制作动态库

gcc -c demo.c -o demo.o -fPICgcc -o libdemo.so demo.o -shared

-fPIC是位置无关码,-shared是按照共享库的方式来链接。

第三步:发布动态链接库时,发布libxxx.so和xxx.h即可。

2、使用共享库

#include "demo.h"#include <stdio.h>int main(void){    func1();    int a = func2(4, 5);    printf("a = %d.\n",a);    return 0;}
gcc test.c -o test -ldemo -L.

编译成功,但是运行出错。

./test: error while loading shared libraries: libdemo.so: cannot open shared object file: No such file or directory

错误原因:动态链接库运行需要被加载(运行环境在执行test程序的时候发现动态链接了libdemo.so,于是会去固定目录尝试加载libdemo.so,如果加载失败则会输出以上错误信息)。

解决方法一:将libdemo.so放到固定目录下就可以了,这个固定目录一般是/usr/lib目录。cp libdemo.so /usr/lib即可。

解决方法二:使用环境变量LD_LIBRARY_PATH。操作系统在加载固定目录/usr/lib之前,会先去LD_LIBRARY_PATH这个环境变量所指定的目录去寻找,如果找到就不用去/usr/lib下面找了,如果没有找到再去/usr/lib下面找。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库的目录

3、ldd命令的作用
可以在一个使用了共享库的程序执行之前,解析出这个程序使用了哪些共享库,并且查看这些共享库是否能被加载并解析(决定这个程序是否能被正确执行)。

#:/work/c_test$ ldd test        linux-gate.so.1 =>  (0x0015a000)        libdemo.so => not found        libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00955000)        /lib/ld-linux.so.2 (0x00b4f000)