(1)Linux下编写动态链接库。通常静态链接库是编译的时候和源文件一起编译生成可执行文件的。动态链接库则不是,它是一个已经编译好的文件(静态则不是),只有当程序运行的时候(但是编译的时候要将动态链接库的信息加载进来),它才去找动态链接库拿它想用的一些函数。而且动态链接库可以提高通用性,编写一个动态链接库可以让很多人一起用。有点类似类?
test_so.h
#ifndef _TEST_SO_H #define _TEST_SO_H #include <stdio.h> #include <stdlib.h> void test_a(); void test_b(); void test_c(); #endif
test_a.c
#include "test_so.h" void test_a() { printf("this is test_a()\n"); }
test_b.c
#include "test_so.h"
void test_b()
{
printf("this is test_b()\n");
}
test_c.c
#include "test_so.h" void test_c() { printf("this is test_c()\n"); }
然后将这些文件编译为动态链接库gcc test_a.c test_b.c test_c.c --shared -fPIC -o libtest.so,则生成libtest.so文件(它已经编译好了),和普通可执行程序不同,它并没有main()。
在看如何调用它
编写test.c
#include "test_so.h" int main(void) { test_a(); test_b(); test_c(); return 0; }
gcc test.c -L . -ltest -o test ((-L .)表示动态链接库在本目录, (-ltest)表示动态链接库的名字为lib(test).so)。
然后通过ldd ./test查看有哪些动态链接库和可执行程序有关联。
结果发现libtest.so没有关联。
运行./test出现:
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
也就是说找不到这个动态链接库,但是我们已经在编译test.c的时候加入路径了?
这时候修改LD_LIBRARY_PATH变量
#vim ~/.bashrc 添加: LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/home/xxx/Test export LD_LIBRARY_PATH 退出以后 #source ~/.bashrc
或者/etc/ld.so.conf添加动态链接库的路径。
#vim /etc/ld.so.conf 添加一行:/home/xxx/Test 然后刷新一把 #/sbin/ldconfig -v 再编译执行成功。