extern "C" __declspec(dllexport) int Add(int a, int b); extern __declspec(dllimport) int g_a; class __declspec(dllexport) Test public:         Test(int d);         ~Test(); public:         int GetData() const; private:         int data;

Test_Dll.def的文件实现

LIBRARY "Test_Dll"
EXPORTS
        g_a DATA

这里写了个函数以示区别。

很多.def有人写的不是DATA而是CONSTANT,其实CONSTANT这个是老式的了。

我们用的CONSTANT关键字,可能调用到的g_a得到的可能是他的地址,而不是变量本身

编译获得Test_Dll.dll和Test_Dll.lib两个文件还有Test_Dll.h头文件

复制到我们要调用的工程下

工程调用.dll使用静态加载的方式去调用

main.cpp文件

#include "Test_Dll.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "Test_Dll")
extern __declspec(dllimport) int g_a;
int main(void)
        cout << "Add(10, 30) : " << Add(10, 30) << endl;
        cout << "g_a = " << g_a << endl;
        Test t(10);
        cout << t.GetData() << endl;
        return 0;

Test_Dll.h头文件(这里做了一点修改,把extern __declspec(dllexport) int g_a修改成extern __declspec(dllimport) int g_a)

#pragma once
extern "C" __declspec(dllexport) int Add(int a, int b);
extern __declspec(dllimport) int g_a;
class __declspec(dllexport) Test
public:
        Test(int d);
        ~Test();
public:
        int GetData() const;
private:
        int data;

这个修改是比较重要的,不然的话编译会出错的

最后结果:

函数和类的导出做法是一样的,而全局变量的导出需要.def去解析

全局变量的导出(这里是在windows环境下去讨论这个问题)全局变量的导出与函数的导出并不一样,我们导出全局变量我们必须提供.def的文件去解析 我们这里创建的DLL是Test_DllTest_Dll.cpp的文件实现#include &quot;Test_Dll.h&quot;int g_a = 10;int Add(int a, int b){        return a...
动态链接库(DLL)是一种保存可重用代码的文件格式,它可以在多个应用程序间共享,从而有效地节省系统资源。因此,编写DLL是程序员必备的技能之一。 在编写DLL,首先需要确定需要导出的函数和变量。导出函数和变量需要使用“__declspec(dllexport)”修饰符,并将它们放在一个.def文件中进行编译。这一步可以通过Visual Studio编译器完成。在编译,需要将DLL文件作为输出文件型。 在编写DLL,需要遵循一定的规范。首先,应该避免使用全局变量,因为它们可能会被多个应用程序共享,导致程序错误。其次,需要确保导出函数和变量的名称在各个应用程序中都是唯一的。此外,应该尽量减少DLL文件的大小,避免占用过多的系统资源。 编写好DLL后,可以通过LoadLibrary函数将其加载到目标应用程序中。这个函数会返回一个模块句柄,可以使用GetProcAdress函数获得DLL导出函数和变量的地址。然后我们就可以调用这些函数和变量了。 总之,编写动态链接库需要遵循一定的规范,需要明确导出函数和变量的名称和型,同需要注意文件的大小和使用范围,只有这样才能编写出优秀的DLL文件,有效地提高程序开发的效率。