现在的位置: 首页 > 综合 > 正文

导出c++全局对象

2018年02月15日 ⁄ 综合 ⁄ 共 944字 ⁄ 字号 评论关闭

    今天,给公司代码大搬家,发现有个模块导出了全局对象。晕哪。如果非要使用一个全局对象,

可以定义一个函数,返回这个全局对象,再导出这个全局对象即可。现在的问题是,其它模块

不能找到导出的全局函数。但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这个全局对象,在导出表中这个对象表现为一地址(^_^,费话,只能导出地址)。

有时,也别难为编译器了。能简单写就简单写。

下载链接

http://download.csdn.net/source/3439912

抱歉!评论已关闭.