2007年10月31日 星期三

[C++] LNK2019: unresolved external symbol "__declspec(dllimport) xxx" referenced in xxx.

這種問題通常很簡單, 就是你的程式呼叫了 library 中沒有的函式.

但是如果你的 library.h 中, 真的有這個函式, 卻還是發生這種狀況.
那就很詭異了.

然而, 如果你在 C++ 的環境中, 呼叫 C 所建立的 library 或 dll.
這種詭異的現象就會發生.

明明給了 library, 就是無法 link!

發生這種問題的主要原因在於, C++ 與 C 對 function name 的內部表示不一樣.
因為 C++ 為了提供 function overload 的功能, 所以會在原來的 function name 後面
加入一些記號 (mangle),

這使得 C++ 要呼叫 C 的 library function, 會發生問題.

解決方法
只要在 .h 檔中, 外面包上一層


#ifdef __cplusplus
extern "C" {
#endif

原來的 C .h 內容

#ifdef __cplusplus
}
#endif


這樣就可以讓 C++ 呼叫這些 fucntion 時, 不要加 mangle.
進而解決這個問題, 當然了這些 function 自然不支援 overload 的功能.


by Jing

3 則留言:

  1. 你好!
    我是台灣的學生:)
    今天下午被這個問題"卡"了4個多小時 Orz...
    感謝這篇文章解救了我^_^

    回覆刪除
  2. 提醒一下跟我遇到相同問題的人

    如果你的IDE是Keil uVision
    請確認你所extern的function所在的.c檔

    是不是已經add to project

    不然你檢查程式一個禮拜也檢查不出原因的

    回覆刪除