VC匯出函式衝突

2021-07-25 15:53:57 字數 1275 閱讀 9631

前提:

1、本工程a 需要匯出介面create,但是這個介面,已經暴露出去了,不能修改這個介面名 。也就是在a.def裡面存在 create 的匯出

介面定義為 extern bool create(void**p){}

2、本工程a需要#include "b.h" 檔案,而b.h 檔案裡面存在如下**:

class test

public:

bool create(void** pdata){}     

此時會出現問題:

編譯的時候,會提示說

1>a.def : warning lnk4022: cannot find unique match for symbol 'create'

1>a.def : warning lnk4002: "public: bool __thiscall ctest::create(void * *)"  defined in .\release\b.obj

1>a.def : warning lnk4002: "bool __stdcall create(void * *)" defined in .\release\a.obj

1>a.def : error lnk2001: unresolved external symbol create

也就是他找不到create這個函式應該用哪個了。

這個時候可以在需要匯出的函式定義時加入"c",是能解決問題的。

extern "c" bool __stdcall  create(void** pdata);  

那麼為什麼呢?

我們知道c++會在編譯的時候,對函式的命名會做一些修改,原因是c++是支援過載的。而c不支援,因此為了支援過載,c++會對函式根據引數來產生乙個全域性唯一的函式名。

比如bool create(void** pdata)可能就會產生類似於void**_create這樣的函式名。

然後我們在加入

class test

public:

bool create(void** pdata){}     

之前還是能編譯通過的,因此我琢磨著,vc估計是做了模糊匹配;而我們加了這個類之後,就不行了,應該是這裡也產生了乙個test_void**_create類似的函式名,然後vc的模糊匹配就匹配不出來是應該用誰了。

而extern "c" 的意思是,不需要對函式名做任何的調整。(所以我們一般在匯出函式的時候,應該都要加上exterrn "c" 才是對的。)那麼vc在匹配的時候,肯定第乙個是匹配完整的,匹配到了,就不會做模糊匹配了。

因此這麼玩就能編譯通過了。

VC 類成員函式指標匯出與匯入

vc 類成員函式指標匯出與匯入 一 匯入外來函式指標 定義乙個類,類中有幾個函式成員完成相似的功能,根據呼叫者選的模式對相應的函式進行呼叫 在funtion 函式下如果按下面的 呼叫的話,由於這個funtion 頻繁呼叫 成千上萬次 如果每次都進行判斷效能會降低很多.所以準備用類成員函式代替下面的段...

VC預設鏈結庫衝突

在同乙個專案中,所有的原始檔必須鏈結相同的c執行時庫。如果某一檔案用了multithreaded dll版本,而其他檔案用了single threaded或者multithreaded版本的庫,也就是說用了不同的庫,就會導致這個警告的出現。總之,一句話,lib之間有衝突。需要刪除匯入的一些 libs...

VC匯出資料到EXCEL

我們製作應用軟體的時候,經常要把結果以報表的形式輸出,當前使用較為廣泛的當然是excel 本文簡略介紹在vc 6.0中如何使用excel2003的庫函式並對其進行程式設計。先建立乙個對話方塊工程,命名為vcexcel。在對話方塊中新增乙個按鈕,控制項id為id runexcel,介面如下 是不是很搞...