生成动态链接库
方式一
利用VS项目并配置类型生成。
注意需要添加一个声明,才能在生成dll的同时生成lib文件。
//定义导出函数,__declspec(dllexport) 在函数类型前,若是类,则在class和类名之间
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)
调用DLL:
- 拷贝头文件,lib文件,dll文件给软件项目路径下。
- 调用头文件,以及链接lib文件(如果选择生成静态库lib,就不用管dll了)。
#include"fun.h"
#pragma comment(lib, "dll.lib")
int main()
{
std::cout << "输出a+b=" << add(9, 6) << std::endl;
return 0;
}
方式二
利用gcc/g++直接对.cpp或.c文件通过命令生成。
- 生成dll文件命令
gcc -shared -o dll_demo.dll add.cpp - 生成lib文件
a. 先生成.o文件命令为: g++ -c add.cpp
b. 然后根据.o文件生成.lib:ar -crv test.lib add.o
方式三
使用g++命令
- 生成命令 g++ MyDllFunc.cpp -fPIC -shared -o libtest.so
- 调用时 g++ call.cpp libtest.so -o main 或 $ g++ main.cpp -L. -ltest -o main
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
动态链接库与静态链接库
动态链接库dll
具体使用时包含3个文件:
- 头文件,函数的声明
- dll文件,函数的实现
- lib文件,函数的索引
静态链接库具体使用时包含3个文件:
- 头文件,函数的声明
- lib文件,函数的索引与实现
两者区别
1.当多个进程使用动态链接库时,库中的函数和数据并不复制到可执行文件中,而是通过lib文件找到函数的地址入口调用,多个进程共享一份资源,因此可以节省内存。
2. 静态链接库使用时,会把静态库的所有内容拷贝到当前进程中来。