1. 程式人生 > >VC++匯出具有名稱空間的函式

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檢視結果為:

[email protected]@@[email protected]@@Z

[email protected]@[email protected]@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名字空間裡的。

[email protected]@@[email protected]@@Z
[email protected]@[email protected]@QAEXXZ
[email protected]@YAXXZ

3 解決辦法

知道了原因,解決起來非常簡單,只需要在實現檔案中f()的定義中使用MiniMFC名字空間進行限定。如下所示:

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

重新編譯後,這次得到了正確的結果:

[email protected]@@[email protected]@@Z
[email protected]@[email protected]@QAEXXZ
[email protected]@@YAXXZ

相關推薦

VC++匯出具有名稱空間函式

問題現象 原因分析 解決辦法 1 問題現象 匯出具有名稱空間的函式和類。原始碼如下: 標頭檔案MiniMFC.h namespace MiniMFC { __declspec(dllexport) void f(); cl

動態傳參(*args **kwargs 無敵傳參) 作用域globals locals和名稱空間 函式的巢狀 關鍵字nonlcas global

動態傳參(重點) *, ***, ** :形參: 聚合 位置引數* -> 元組 關鍵字** -> 字典實參: 打散 列表, 字串, 元素 -> * 字典 -> ** 形參的順序(重點): 位置 *args(位置引數動態傳參) 預設值 **kwargs

深入剖析js名稱空間函式namespace

在看阿里員工寫的開源資料庫連線池的druid的原始碼時,發現了其中在jquery的原始碼中又定義了一個名稱空間的函式:$.namespace(),其程式碼如下: $.namespace = function() { var a=arguments, o=null, i, j, d;

C++關鍵字、名稱空間函式過載、預設引數、行內函數、引用

一 .C++入門 1.C++關鍵字 2.名稱空間 3.C++輸入&輸出 4.預設引數 5.函式過載 6.引用 7.行內函數 8.auto關鍵字 9.基於範圍的for迴圈 10.指標空值nullptr&nullptr_t 二. 正文 1.C++關鍵字(C++98)   

我的Python成長之路---Day11-函式的使用及名稱空間和作用域

1.昨天函式的引數內容的補充 命名關鍵字引數: 在定義函式時,*與**之間引數稱之為命名關鍵字引數特點: 在呼叫函式時,命名關鍵字引數必須按照key=value的形式傳值 def func(x,*,y=1,z): 在這裡*後邊的y和z都是命名關鍵字引數,y像預設引數一樣被事先

名稱空間專有函式

轉自: https://blog.csdn.net/zhizhengguan/article/details/80940881 #include <iostream> using namespace std; namespace data { int a; int b

名稱空間函式的巢狀

2. 名稱空間: 區域性名稱空間 全域性名稱空間 內建名稱空間 載入順序: 內建 > 全域性 > 區域性 取值順序: 區域性 > 全域性 > 內建 作用域: 全域性作用域: 內建 + 全域性 區域性作用域: 函式區域性 # print(glo

函式進階之名稱空間

名稱空間是名稱到物件的對映。名稱空間是一個字典的實現,鍵為變數名,值是變數對應的值。各個名稱空間是獨立沒有關係的,一個名稱空間中不能有重名,但是不同的名稱空間可以重名而沒有任何影響。x = 1在記憶體中是{x:4304947712} x對應的是1的記憶體地址名稱空間分三種locals: 是函式內的名稱空間

C++之bool型別,名稱空間的練習——使用一個函式找出一個整型陣列中的最大值或最小值

#include<iostream> using namespace std; int findMaxOrMin(int * n,int number) { int temp=n[0]; bool isMax; cin>>isMax; for(int i=1;

名稱空間、類、檔案、函式

若給名稱空間、類、檔案、函式的作用域排個大小應該是: 全域性>名稱空間>類>檔案>函式 一個檔案可以包含多個名稱空間,一個名稱空間也可以分佈在多個檔案中 1)名字空間名稱相同,成員名字不同,那麼他們會自動合併為一個名字空間,可以理解為追加 2)名字空間名稱相同

Python - 函式基礎概念 - 三種形式、引數、巢狀、名稱空間

目錄 一、函式的三種形式 1-1 語句形式 - foo() 1-2 表示式形式 - 3*len('hello') 1-3 引數形式 - range(len('hello')) 二、 形參 and 實參 2-1 位置引數 - 實參和形參位置上一一對

C++名稱空間&預設引數&函式過載

名稱空間 使用名稱空間是要對識別符號的名稱進行本地初始化,避免命名衝突。 定義名稱空間需要用到namespace關鍵字,後跟名稱空間的名字,在{}內為名稱空間的成員 //普通的名稱空間 namespace N1{ //名稱空間的名稱為N1 //可定義變數也可以定義函式 int a =

函式程式設計(名稱空間,閉包,裝飾器,)

一、名稱空間 名稱空間 namespace  存放名字的地方 x=1 名稱空間存放 x 和 x與1繫結關係 類似{x:id(1)} 1.1.名稱空間分三種:  1.locals 是函式內的名稱空間,包括區域性變數和形參 locals()   2.globals

C++學習筆記——名稱空間&預設引數&函式過載&引用

C++學習筆記——名稱空間&預設引數&函式過載&引用 戳這裡:我的印象筆記原連結 C++: 1.解決C語言中設計不好或者使用不是很方便的語法—>優化 2.增加新的語法特性 注:extern “C”:在C++工程中,將程式碼按照C語言的風格來編譯

函式物件、函式巢狀、名稱空間與作用域、閉包函式、裝飾器

一.函式物件 函式時第一類物件,函式可以當作資料傳遞 1.函式可以被引用 2.函式可以作為引數傳入 3.函式可以作為函式的返回值 4.函式可以作為容器型別的元素 二.函式巢狀 1.函式巢狀呼叫:在函式內又呼叫了其他函式 2.函式巢狀定義:在函式內又定義了其他函式(只能在其函式內部呼叫,在其函式

函式物件,名稱空間和作用域以及閉包函式和裝飾器

重點:函式func() 兩層含義:   第一層: func 指函式物件,指向記憶體地址   第二層: 括號表示觸發函式功能 一. 函式物件(可以理解為函式名):在面對物件中,一切皆物件   具體體現:1.函式可以引用        2.可以作為函式的引數        3.可以作為函式返回值  

函式物件,函式巢狀,名稱空間與作用域,閉包函式

函式是第一類物件: 指的是函式名指向的值(函式)可以被當作資料去使用def func(): # func=函式的內地址 print('from func')print(func)age=101. 可以被引用x=ageprint(x,age)f=funcprint(f)f()2. 可以當作引數傳給另外一個

函式物件,函式巢狀,名稱空間與作用域,裝飾器

一,函式物件 函式是第一類物件,即函式可以當做資料傳遞   1.可以被引用   2.可以當做引數傳遞 len(x) def foo(m): # print(m) m() foo(func)     3.返回值可以是函式 def foo(x): #x=fu

20181128(閉包函式函式巢狀,名稱空間,作用域,裝飾器待補充)

  一、函式物件 在面向物件的程式設計中 一切皆物件 具體的體現: 1.函式可以被引用 def bar():    print('from bar')​f=barf()輸出結果為:from bar 2.函式可以作為函式的引數 def bar():  

C++:名稱空間、預設引數、函式過載、引用、行內函數

一.名稱空間           在C/C++中,變數、函式和類都是大量存在的,這些變數、函式和類的名稱都將作用於全域性作用域中,可能會導致很多衝突,所以我們就選擇使用名稱空間。         &nb