DLL(动态链接库)的基本使用及def文件无效问题

  1. 首先创建一个DLL项目
    在这里插入图片描述

  2. 在.cpp文件中随便写一个函数

void fun1()
{
	printf("我是fun1");
}
  1. 在.h文件中写入声明
void fun1();
  1. 在工程目录下添加def模块
    【这里一定要注意是选择模块,添加def文件】
    在这里插入图片描述
    在这里插入图片描述
  2. 在def模块文件中写入以下内容
LIBRARY
EXPORTS
fun1 @ 1
  1. 在解决方案下新建一个控制台项目
    在这里插入图片描述
  2. 在新建的控制台项目中写入以下内容
int main()
{
	fun1();
	system("pause");
}
  1. 先生成DLL项目,再生成控制台项目,最后再运行控制台生成的.exe程序
    在这里插入图片描述

遇到的问题:
生成控制台项目时提示“无法解析的外部符号”
这里的话主要就是模块定义文件的问题

  • 右键点击DLL项目,选择“属性”,找到配置属性->链接器->输入->模块定义文件
    在这里插入图片描述
  • 在创建模块资源时其实已经自动指定了该.def文件,如果这里为空白,添加.def文件名后任然提示“无法解析的外部符号”,则返回上面的第4步,重新添加模块为.def,尽量避免添加别的资源采用更改后缀的方式。
C++ 中,DLL (动态链接库) 要引用主程序中的变量,通常需要通过几种方式来完成,因为 DLL 的作用域是在其自身的地址空间内,而不会直接访问主程序的数据。当试图使用 `extern` 关键字将变量声明为全局并在 DLL 中引用它时,可能会遇到一些限制。 1. 函数原型声明:如果你希望在 DLL使用主程序的函数,可以先在头文件 (.h) 中仅声明函数原型(无实际定义),然后在主程序和 DLL 中分别提供完整定义。例如: ```cpp // 主程序.h extern "C" int MyFunction(int value); // 主程序.cpp #include "主程序.h" int MyFunction(int value) { // 实现... } // DLL.h extern "C" __declspec(dllexport) void UseMyFunction(int value); ``` 2. 全局变量导出:对于需要从 DLL 引入的全局变量,可以在 DLL.def 文件中进行显式导出(如 MSVC 中的 `__declspec(dllexport)` 或者 Linux 下的 `__attribute__((visibility("default")))`)。但在使用 `extern` 定义变量时,`extern` 只能在包含该变量定义的地方使用无法直接在 DLL 中引用。 ```cpp // 主程序.cpp extern int g_sharedVariable; // DLL.def LIBRARY "mydll.lib" EXPORTS UseSharedVariable proc near end LIBRARY // DLL.cpp #pragma comment(lib, "mydll.lib") // 需要在编译时链接到这个库 int g_sharedVariable = 0; // 在这里定义并导出 void UseSharedVariable() { // 访问g_sharedVariable } ``` 由于外部可见性的限制,如果直接在 DLL使用 `extern` 来引用主程序中的变量,`extern` 本身并不能跨模块共享数据。此时需要配合其他技术(比如全局变量、静态成员变量等)以及正确的链接步骤来实现共享。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值