全局变量的导出(这里是在windows环境下去讨论这个问题)
全局变量的导出与函数的导出并不一样,我们导出全局变量我们必须提供.def的文件去解析
我们这里创建的DLL是Test_Dll
Test_Dll.cpp的文件实现
#include "Test_Dll.h"
int g_a = 10;
int Add(int a, int b)
{
return a + b;
}
Test::Test(int d)
{
data = d;
}
Test::~Test()
{
}
int Test::GetData() const
{
return data;
}
Test_Dll.h的文件实现
#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;
};
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去解析