今天,给公司代码大搬家,发现有个模块导出了全局对象。晕哪。如果非要使用一个全局对象,
可以定义一个函数,返回这个全局对象,再导出这个全局对象即可。现在的问题是,其它模块
不能找到导出的全局函数。但exe块却可以。真是不可思议。
今天学习了一下导出全局对象,代码如下
//DllOne模块
//global.h
#pragma once
#include "Tea.h"
extern "C"
{
Tea tea;
}
//extern Tea tea;//不行
//DllOne模块
//global.cpp
#include "Tea.h"
Tea tea;
//DllOne模块
//tea.h
#pragma once
#ifdef DLLONEEXPORT
#define DLLONEEXPORT __declspec(dllexport)
#else
#define DLLONEEXPORT
#endif
class DLLONEEXPORT Tea
{
public:
void PrintName();
};
//Tea.cpp
#include "Tea.h"
#include <iostream>
using namespace std;
void Tea::PrintName()
{
cout << "yuwu tea" << endl;
}
并定义预处理器 DLLONEEXPORT
exe文件为
#include <iostream>
#include "../DllOne/global.h"
int main()
{
tea.PrintName();
std::cin.get();
return 0;
};
发现不加
extern "C"时,exe会出现
main.obj : error LNK2001: 无法解析的外部符号 "class Tea tea" (?tea@@3VTea@@A)
看一下,dll导出的函数为??4Tea@@QAEAAV0@ABV0@@Z,根本不是同一个符号,出错就可以理解了。
但我使用的同样的编译器,怎么会编译出不同的符号呢?真是不理解。加上"C"就好了。
在DllOne中,只导出了tea这个全局对象,在导出表中这个对象表现为一地址(^_^,费话,只能导出地址)。
有时,也别难为编译器了。能简单写就简单写。
下载链接