zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Shell编程-02-Shell变量
    Linux 下强大的查找命令find
    DevOps 学院
    史上最详细、最全面的Hadoop环境搭建
    Linux 中10个命令链接操作符,帮助新手快速入门运维!
    25个Linux性能监控工具
    一文详解 Linux系统常用监控工具
    ansible 安装指南
    Tomcat管理页面
    Tomcat基础知识
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7365860.html
Copyright © 2011-2022 走看看