2010-01-19 84 views
1

我從Visual C++代碼生成了一個DLL。依賴Walker將3個函數導出爲C函數。DLL:作爲C/C++函數導出?

我做了一個SCons項目來生成DLL,並且3個函數中的2個不被視爲C函數。

什麼使函數看作是一個或C++函數,而不修改代碼?它必須在編譯/鏈接選項中,但我沒有找到任何相關的東西。

功能由宏前綴:AM_LIB_EXPORT

在.H,我有:

#ifdef _WIN32 
#define AM_LIB_EXPORT __declspec(dllexport) 
#else 
#define AM_LIB_EXPORT 
#endif // _WIN32 

感謝。

+1

看看(http://en.wikipedia.org/wiki/X86_calling_conventions) – lsalamon 2010-01-19 15:18:25

+0

你確定使用scons編譯時定義了_WIN32嗎? – 2010-01-19 15:39:17

回答

3

是什麼讓函數看作一個或C++函數,而不修改代碼?

由C++編譯器編譯的函數自動爲'C++函數',並且會出現名稱重組以解決C++特性(如命名空間和重載)。 爲了獲得'C'導出名稱,必須在函數聲明中使用上述extern "C"限定符。或者在包含原型的頭部周圍有一個巨大的extern "C" { .. }塊。

如果這不能解決您的問題,它可能與dllimport/dllexport有關。如果您的DLL構建中有#define AM_LIB_EXPORT __declspec(dllexport),那麼通常還需要爲其鏈接到DLL的應用程序創建dllimport,以便鏈接程序知道從哪裏獲取符號。

3

這是一個名稱的問題嗎?如果你在函數聲明的周圍沒有使用extern "C",它們會得到名稱錯誤。

0

我發現的原因:

出口也被加入作爲其它附加命令行選項(/出口)。在這種情況下,它被導出爲C函數。我不明白爲什麼...

我刪除了這個額外的命令行開關。

謝謝大家。

我仍然不知道如何將線程標記爲「已解決」?

+0

點擊好回覆上的刻度標記 – pm100 2010-01-19 17:29:53

+0

謝謝。我很想剔除自己。 – Oodini 2010-01-19 18:07:26