VC++导出具有命名空间的函数
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++导出具有命名空间的函数的更多相关文章
- JavaScript权威设计--命名空间,函数,闭包(简要学习笔记十二)
1.作为命名空间的函数 有时候我们需要声明很多变量.这样的变量会污染全局变量并且可能与别人声明的变量产生冲突. 这时.解决办法是将代码放入一个函数中,然后调用这个函数.这样全局变量就变成了 局部变量. ...
- VC生成lib的_stdcall函数名与mingw生成的不一致
Qt Creator在Windows系统中,怎样链接VC生成的动态链接库 这个问题曾经困扰了我一整天.我想的是按照VC中的方法,增加include文件,增加lib文件,然后编译即可.谁知链接时总是出现 ...
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- python中的命名空间以及函数的嵌套
一.动态传参 函数的形参中除了默认值参数和位置参数外,还有动态传参.当不确定形参有几个或者有很多的时候,就可以使用动态传参. 1.1 动态接收位置参数 在python中使用*来接收动态位置参数 def ...
- vc 导出函数/调用
loader(exe): #include "stdafx.h" #include <Windows.h> #include <stdio.h> #defi ...
- 《JS权威指南学习总结--8.5 作为命名空间的函数》
内容要点: 函数作用域的概念:在函数中声明的变量在整个函数体内都是可见的(包括在嵌套的函数中),在函数的外部是不可见的.不在任何函数内声明的变量是全局变量,在整个JS程序中都是可见的. 在JS中 ...
- day 10 函数命名空间、函数嵌套和作用域
1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...
- python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)
一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...
- python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)
一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...
随机推荐
- win8操作系统下使用telnet客户端
一.安装Telnet客户端 今天尝试在Win8操作系统下使用telnet客户端连接上搜狐的邮件服务器时,结果出现了'telnet' 不是内部或外部命令,也不是可运行的程序,如下图所示: 上网查了一下原 ...
- AngularJS的增删改查、state嵌套案例,不涉及服务端
本篇实践一个案例,大致是:左边有导航菜单,右边显示列表,并可对列表项编辑或删除,也可添加新的列表项.借此,可体会到:如何组织可扩展的AngualrJS文件结构,如何点击左侧菜单项右侧显示相应内容,an ...
- ASP.NET Web API实践系列11,如何设计出优秀的API
本篇摘自:InfoQ的微信公众号 在设计API的时候考虑的问题包括:API所使用的传输协议.支持的消息格式.接口的控制.名称.关联.次序,等等.我们很难始终作出正确的决策,很可能是在多次犯错之后,并从 ...
- Win7 ArcGIS 10.5 安装错误 A service pack is required on this operatiing system
前段时间有朋友反馈在Win7专业版下安装ArcGIS 10.5, 无法安装,弹出错误: A service pack is required on this operatiing system,如图: ...
- python测试开发django-14.查询表结果(超详细)
前言 django查询数据库的方法很多,不同的方法返回的结果也不太一样,本篇详细讲解关于查询的13个方法 返回对象是对象列表的: all(), filter(), exclude(), order_b ...
- 阿里云上部署kafka--遇到的坑
阿里云防火墙关闭,并且配置规则.不然会导致访问不到服务. 问题一: Caused by: java.net.UnknownHostException: iZuf68tztea6l5ccdz7wemZ: ...
- hyper-V下虚拟机连接外网,怎么才能将Hyper-V 的虚拟机接入互联网?
现在情况是这样的: windows hyper-V主机IP: 192.168.20.3 hyper-v虚拟网卡IP:192.168.20.13 虚拟机1IP:192.168.20.21 同一局域网主机 ...
- Emscripten教程之连接C++和JavaScript(三)
本文是Emscripten-WebAssembly专栏系列文章之一,更多文章请查看专栏.也可以去作者的博客阅读文章.欢迎加入Wasm和emscripten技术交流群,群聊号码:939206522. E ...
- go语言之进阶篇通过map生成json
1.通过map生成json 示例1: package main import ( "encoding/json" "fmt" ) func main() { / ...
- 用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站
从ASP.NET MVC第一个版本开始到现在,创建ASP.NET MVC项目的官方方法只有一个,“文件”->“新建”->“项目”,然后选择ASP.NET MVC X Web应用程序. 这种 ...