• 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

  • 相关阅读:
    Java设计模式之单例模式
    docker常用命令2
    Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate';
    Apache RocketMQ在linux上的常用命令
    RocketMQ的broker启动失败解决
    xshell与xftp使用注意
    Springboot项目打包成jar运行2种方式
    docker常用命令记录
    MySql常用语句总结更新
    springboot启动报错start bean 'eurekaAutoServiceRegistration' NullPointerException
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7365860.html
Copyright © 2020-2023  润新知