2009-10-26 76 views
1

我有一個C-Wrapper代碼用於我的C++框架。由於這應該在Mac和Windows上運行我使用scons的來自C++源代碼的C-DLL

env = Environment() 
env.Append(CPPPATH = ['./']) 
env.Append(LIBS = 'kernel32.lib') 
env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib') 

env.SharedLibrary(target='warpLib', source='warplib.cpp') 

warplib.cpp的簡單版本和warplib.h是這樣的:

warplib.cpp

#define DllExport __declspec(dllexport) 
#include "warplib.h" 

extern "C" { 
    DllExport int foo(int a) { 
    return a; 
    } 
} 

warplib.h

#define DllExport __declspec(dllexport) 

extern "C" { 
    DllExport int foo(int a); 
} 

有人可以告訴我那有什麼問題嗎?我嘗試了'extern'C''幾乎所有可能的組合,但它總是會引發類似「錯誤C2732:鏈接規範與'...'的早期規範相矛盾」。

如果我跳過'extern「C」'它可以工作,但我沒有看到.lib文件,我非常確定我需要那個真正使用庫。

回答

0

您應該只需要extern "C"上的聲明。包括該頭文件的任何人都希望使用C鏈接標準來鏈接它,而不是C++裝飾表單。如果包含warplib.h,則warplib.cpp源文件和後續目標文件將正確顯示函數foo

當使用MSVC時,會有大量半實用的腳本和提供的「構建環境」控制檯快捷方式,並提供了許多與dev相關的環境變量和路徑。我建議找到一個合適的腳本來執行,以便將這些變量插入到您的環境中,或運行開發控制檯。