导出c++全局对象

来源:互联网 发布:linux开机启动过程信息 编辑:程序博客网 时间:2024/06/14 13:35

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

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

不能找到导出的全局函数。但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 #endifclass 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

原创粉丝点击