C++ 生成动态链接库与调试

生成动态链接库

方式一

利用VS项目并配置类型生成。
在这里插入图片描述
注意需要添加一个声明,才能在生成dll的同时生成lib文件。

//定义导出函数,__declspec(dllexport) 在函数类型前,若是类,则在class和类名之间
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)

调用DLL:

  1. 拷贝头文件,lib文件,dll文件给软件项目路径下。
  2. 调用头文件,以及链接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文件通过命令生成。

  1. 生成dll文件命令
    gcc -shared -o dll_demo.dll add.cpp
  2. 生成lib文件
    a. 先生成.o文件命令为: g++ -c add.cpp
    b. 然后根据.o文件生成.lib:ar -crv test.lib add.o

方式三

使用g++命令

  1. 生成命令 g++ MyDllFunc.cpp -fPIC -shared -o libtest.so
  2. 调用时 g++ call.cpp libtest.so -o main 或 $ g++ main.cpp -L. -ltest -o main

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

动态链接库与静态链接库

动态链接库dll

具体使用时包含3个文件:

  1. 头文件,函数的声明
  2. dll文件,函数的实现
  3. lib文件,函数的索引

静态链接库具体使用时包含3个文件:

  1. 头文件,函数的声明
  2. lib文件,函数的索引与实现

两者区别

1.当多个进程使用动态链接库时,库中的函数和数据并不复制到可执行文件中,而是通过lib文件找到函数的地址入口调用,多个进程共享一份资源,因此可以节省内存。
2. 静态链接库使用时,会把静态库的所有内容拷贝到当前进程中来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AICVer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值