1 问题现象

导出具有命名空间的函数和类。源码例如以下:

头文件MiniMFC.h

namespace MiniMFC
{
__declspec(dllexport) void f();
class __declspec(dllexport) MyClass
{
public:
void Mf();
};
}

实现文件MiniMFC.cpp

#include "stdafx.h"
#include <iostream>
using namespace std; #include "MiniMFC.h"
using namespace MiniMFC; void MyClass::Mf()
{
cout << "I'm MiniMFC::MyClass::Mf() from DLL" << endl;
} void f()
{
cout << "I'm MiniMFC::f() from DLL" << endl;
}

终于生成的dll文件里并没有导出void f()函数。

使用dependency Walker查看结果为:

??4MyClass@MiniMFC@@QAEAAV01@ABV01@@Z

?Mf@MyClass@MiniMFC@@QAEXXZ

可见仅仅导出了类的构造函数和成员函数。全局函数f()没有导出。

2 原因分析

实现文件里的函数f()的定义并未使用名字空间MiniMFC,所以仅仅得到了全局名字空间的一个名为f的函数。而头文件里声明的那个MiniMFC名字空间中名为f的函数并没有实现代码。

我们把.cpp文件里的函数定义改为例如以下:

 __declspec(dllexport) void f()
{
cout << "I'm MiniMFC::f() from DLL" << endl;
}

然后又一次编译。使用Dependency Walker能够看出,这次dll确实导出了名为f的函数。可是它是全局空间的,不是MiniMFC名字空间里的。

??

4MyClass@MiniMFC@@QAEAAV01@ABV01@@Z

?

Mf@MyClass@MiniMFC@@QAEXXZ

?

f@@YAXXZ

3 解决的方法

知道了原因。解决起来很easy。仅仅须要在实现文件里f()的定义中使用MiniMFC名字空间进行限定。

例如以下所看到的:

void MiniMFC::f()
{
cout << "I'm MiniMFC::f() from DLL" << endl;
}

又一次编译后。这次得到了正确的结果:

?

?4MyClass@MiniMFC@@QAEAAV01@ABV01@@Z

?Mf@MyClass@MiniMFC@@QAEXXZ

?f@MiniMFC@@YAXXZ

VC++导出具有命名空间的函数的更多相关文章

  1. JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)

    1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...

  2. VC生成lib的_stdcall函数名与mingw生成的不一致

    Qt Creator在Windows系统中,怎样链接VC生成的动态链接库 这个问题曾经困扰了我一整天.我想的是按照VC中的方法,增加include文件,增加lib文件,然后编译即可.谁知链接时总是出现 ...

  3. MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

    ———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...

  4. python中的命名空间以及函数的嵌套

    一.动态传参 函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参. 1.1 动态接收位置参数 在python中使用*来接收动态位置参数 def ...

  5. vc 导出函数/调用

    loader(exe): #include "stdafx.h" #include <Windows.h> #include <stdio.h> #defi ...

  6. 《JS权威指南学习总结--8.5 作为命名空间的函数》

    内容要点:    函数作用域的概念:在函数中声明的变量在整个函数体内都是可见的(包括在嵌套的函数中),在函数的外部是不可见的.不在任何函数内声明的变量是全局变量,在整个JS程序中都是可见的. 在JS中 ...

  7. day 10 函数命名空间、函数嵌套和作用域

    1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...

  8. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)

    一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...

  9. python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)

    一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...

随机推荐

  1. Nginx FastCGI的运行原理

    http://www.cnblogs.com/yinshoucheng-golden/p/6474034.html

  2. oracle HA 高可用性具体解释(之二,深入解析TAF,以及HA框架)

    oracle HA 高可用性具体解释(之中的一个,client.server端服务具体解释):http://write.blog.csdn.net/postedit 我们已经看到TAF是的Oracle ...

  3. 在ASP.NET MVC下实现树形导航菜单

    在需要处理很多分类以及导航的时候,树形导航菜单就比较适合.例如在汽车之家上: 页面主要分两部分,左边是导航菜单,右边显示对应的内容.现在,我们就在ASP.NET MVC 4 下临摹一个,如下: 实现的 ...

  4. mvn常用插件目标

    由于Maven在使用时非常简单,比如下面是百度百科中对Maven常用命令的列表: mvn archetype:create 创建Maven项目 mvn compile 编译源代码 mvn deploy ...

  5. uifont 字体详解

    时间2013-06-04 11:26:33 CSDN博客原文  http://blog.csdn.net/u010013695/article/details/9020611 我们在开发中很多时候要设 ...

  6. Xcode 5中非常期待的6个功能

    这里是新特征汇总博文链接:iOS7新特征汇总 小引: 自从北京时间2013年06月11日苹果发布Xcode 5 Developer Preview 1,到现在(2013年7约15日)已经过去一个月,苹 ...

  7. C#编程(十六)----------匿名类型

    匿名类型 var和new关键字一起使用,可以创建匿名类型. 匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型. 类型名由编译器生成,并且不能在源代码级使用 ...

  8. python测试开发django-26.表单提交之post登录案例

    前言 注册和登录功能实现都是post请求接口,只不过注册是往数据库插入数据,登录是从数据库里面查询数据. 本篇接着上一篇写个简单的登录页面请求,用户注册时密码加密存储,用户登录时候对输入的密码校验. ...

  9. Unity中的内存泄漏

    在对内存泄漏有一个基本印象之后,我们再来看一下在特定环境——Unity下的内存泄漏.大家都知道,游戏程序由代码和资源两部分组成,Unity下的内存泄漏也主要分为代码侧的泄漏和资源侧的泄漏,当然,资源侧 ...

  10. HTML5学习笔记:跨域

    在跨域安全性方面,有多个地方会有限制,主要是XMLHttpRequest对象的跨域限制和iFrame的跨域限制,下面我们分别来看一下. Ajax跨域(CORS) CORS是一个W3C标准,全称是&qu ...