动态库的基本表示方法:
Windows: xxxx.dll .h
Linux : xxxx.so .h
动态库其实是一个函数的集合,是按照一定的规则来做的,用来被操作系统加载,而它本身并不是一个.exe,
而一个.exe的运行过程:首先是操作系统去创建一个进程1.exe,然后操作系统再去检测这个进程是否需要额
外的动态库,如果需要,则要按照一定的规则去加载(操作系统不知道到什么地方去加载动态库,则需要配
置路径 1.win:PATH 2.Linux : .bash_profile)
需要注意的是:动态库的名字(工程),不要用中文。
_declspec(dllexport) Windows下在想作为接口封装设计的接口的几个函数前加上_declspec(dllexport),
编译,若出错,则在.h 文件中函数声明之前也加上,这样再编译就能成功,否则可能编译不成功
动态库编译之后会生成一个,dll和一个.lib .dll是二进制目标集合,.lib是对.dll进行描述(描述动态库中有
多少个函数,哪些函数被导出......)而编译的过程就是与vc编译器,然后告诉编译器使用动态库,若是编译
器找不到资源符号,是因为连接器没有配置xxxx.lib.解决方法:
1.把头文件 .lib .dll加入到新工程下
2.告诉编译器使用动态库,在新的工程下右键,属性,连接器,输入。连接器下把.lib加进去,告诉编译器
在这个路径下去加载动态库
3.若编译器找不到动态库.dll,则把.dll拷贝到跟.exe同一目录下再执行。
动态库的调试问题:
1)打开动态库项目该工程
2)打开测试案例
3)把最新的动态库copy到测试案例中
4)F11
动态库内存释放问题:
谁分配内存,就由谁去释放内存
不能直接释放动态库分配的内存,只能调用动态库里的API函数来释放内存,否则debug不断掉release也会
断掉
把.dll .lib 和.h放在一个文件夹之中,这时候可以去掉头文件中的_declspec(dllexport)了,然后把这个文
件夹扔给上一级调用这些函数的人,便可以使用了
gcc -c -fPIC max.c
gcc -shared -o libmax.somax.o
Linux下使用动态库的步骤如下:
- 编写源文件。
- 将一个或几个源文件编译链接,生成共享库。
- 通过
-L<path> -lxxx
的gcc选项链接生成的libxxx.so。 - 把libxxx.so放入链接库的标准路径,或指定
LD_LIBRARY_PATH
,才能运行链接了libxxx.so的程序。