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 -fPIC
gcc -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)