求救-vc.net包装非托管类编译失败
背景:我要把一个非托管的vc库用vc.net包装以供C#中调用。
非托管dll中类:
- C/C++ code
class LANE_SPEECH_DLL CSR {public: void GetRecoWordA ( char * pchRecoWord ); void GetRecoWordW ( wchar_t * pwchRecoWord ); bool StartReco(); CSR(); bool Create( const DWORD dwLanguage = SP_CHINESE, const bool bInproc = true ); bool LoadCrammarFile ( const WCHAR * pwchFilename ); bool SetInputFromWav ( const WCHAR * pwchFileName, const SPSTREAMFORMAT FileFormat ); void ProcessReco( const DWORD dwMilliseconds = 5000 ); bool IsRecoSuccess() const; bool IsRecoEnd() const; virtual ~CSR();}
其中LANE_SPEECH_DLL 的定义为:
- C/C++ code
#ifdef USE_SPEECH_DLL #ifdef LANE_SPEECH_EXPORTS #define LANE_SPEECH_DLL __declspec(dllexport) #else #define LANE_SPEECH_DLL __declspec(dllimport) #endif#else #define LANE_SPEECH_DLL
包装类:
头文件中:
- C/C++ code
public ref class ManagedCSR { public: ManagedCSR(); String^ GetRecoWord(); bool StartReco(); bool Create(int language ,bool bInproc); bool Create(); bool SetInputFromWav(String^ fileName,const SPSTREAMFORMAT FileFormat); bool LoadGrammarFile(String^ fileName); void ProcessReco(int dwMilliseconds); bool IsRecoSuccess(); bool IsRecoEnd(); ~ManagedCSR(); const static int SP_CHINESE = 0x0000; //简体中文. const static int SP_ENGLISH = 0x0001; //英语. private: CSR* csr; };
cpp中:
- C/C++ code
ManagedCSR::ManagedCSR():csr(new CSR()) { } String^ ManagedCSR::GetRecoWord() { wchar_t *recWord = new wchar_t; csr->GetRecoWordW(recWord); String^ word = Marshal::PtrToStringUni(static_cast<IntPtr>(recWord)); delete [] recWord; recWord = NULL; return word; } bool ManagedCSR::StartReco() { return csr->StartReco(); } bool ManagedCSR::Create(const int language,bool bInproc) { return csr->Create(language,bInproc); } bool ManagedCSR::Create() { return csr->Create(ManagedCSR::SP_CHINESE,true); } bool ManagedCSR::SetInputFromWav(String^ fileName, const SPSTREAMFORMAT FileFormat) { IntPtr pString = Marshal::StringToHGlobalUni(fileName); try { wchar_t* wcFileName = static_cast<wchar_t *>(pString.ToPointer()); return csr->SetInputFromWav(wcFileName,FileFormat); } finally { Marshal::FreeHGlobal(pString); } } bool ManagedCSR::LoadGrammarFile(String^ fileName) { IntPtr pString = Marshal::StringToHGlobalUni(fileName); try { wchar_t* wcFileName = static_cast<wchar_t *>(pString.ToPointer()); return csr->LoadCrammarFile(wcFileName); } finally { Marshal::FreeHGlobal(pString); } } void ManagedCSR::ProcessReco( const int dwMilliseconds) { csr->ProcessReco(dwMilliseconds); } bool ManagedCSR::IsRecoSuccess() { return csr->IsRecoSuccess(); } bool ManagedCSR::IsRecoEnd() { return csr->IsRecoEnd(); } ManagedCSR::~ManagedCSR() { delete csr; }
编译一直不能通过,哪位大神帮帮忙。。。
报错如下:
错误1error LNK2028: 无法解析的标记(0A0002A9) "public: bool __thiscall CSR::LoadCrammarFile(wchar_t const *)" (?LoadCrammarFile@CSR@@$$FQAE_NPB_W@Z),该标记在函数 "public: bool __clrcall CSRLib::ManagedCSR::LoadGrammarFile(class System::String ^)" (?LoadGrammarFile@ManagedCSR@CSRLib@@$$FQ$AAM_NP$AAVString@System@@@Z) 中被引用CSRLib.objCSRLib
错误2error LNK2028: 无法解析的标记(0A0002AB) "public: bool __thiscall CSR::SetInputFromWav(wchar_t const *,enum SPSTREAMFORMAT)" (?SetInputFromWav@CSR@@$$FQAE_NPB_WW4SPSTREAMFORMAT@@@Z),该标记在函数 "public: bool __clrcall CSRLib::ManagedCSR::SetInputFromWav(class System::String ^,enum SPSTREAMFORMAT)" (?SetInputFromWav@ManagedCSR@CSRLib@@$$FQ$AAM_NP$AAVString@System@@W4SPSTREAMFORMAT@@@Z) 中被引用CSRLib.objCSRLib
错误3error LNK2028: 无法解析的标记(0A0002B2) "public: void __thiscall CSR::GetRecoWordW(wchar_t *)" (?GetRecoWordW@CSR@@$$FQAEXPA_W@Z),该标记在函数 "public: class System::String ^ __clrcall CSRLib::ManagedCSR::GetRecoWord(void)" (?GetRecoWord@ManagedCSR@CSRLib@@$$FQ$AAMP$AAVString@System@@XZ) 中被引用CSRLib.objCSRLib
错误4error LNK2019: 无法解析的外部符号 "public: void __thiscall CSR::GetRecoWordW(wchar_t *)" (?GetRecoWordW@CSR@@$$FQAEXPA_W@Z),该符号在函数 "public: class System::String ^ __clrcall CSRLib::ManagedCSR::GetRecoWord(void)" (?GetRecoWord@ManagedCSR@CSRLib@@$$FQ$AAMP$AAVString@System@@XZ) 中被引用CSRLib.objCSRLib
错误5error LNK2019: 无法解析的外部符号 "public: bool __thiscall CSR::SetInputFromWav(wchar_t const *,enum SPSTREAMFORMAT)" (?SetInputFromWav@CSR@@$$FQAE_NPB_WW4SPSTREAMFORMAT@@@Z),该符号在函数 "public: bool __clrcall CSRLib::ManagedCSR::SetInputFromWav(class System::String ^,enum SPSTREAMFORMAT)" (?SetInputFromWav@ManagedCSR@CSRLib@@$$FQ$AAM_NP$AAVString@System@@W4SPSTREAMFORMAT@@@Z) 中被引用CSRLib.objCSRLib
错误6error LNK2019: 无法解析的外部符号 "public: bool __thiscall CSR::LoadCrammarFile(wchar_t const *)" (?LoadCrammarFile@CSR@@$$FQAE_NPB_W@Z),该符号在函数 "public: bool __clrcall CSRLib::ManagedCSR::LoadGrammarFile(class System::String ^)" (?LoadGrammarFile@ManagedCSR@CSRLib@@$$FQ$AAM_NP$AAVString@System@@@Z) 中被引用CSRLib.objCSRLib
错误7fatal error LNK1120: 6 个无法解析的外部命令C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\RealProject\CSRLib\Debug\CSRLib.dllCSRLib
对vc不太了解,这些错误都什么意思啊?
[解决办法]
对于CSR类,你只添加了定义,没有引入他的Lib。。。。
原因:没有添加附加的依赖库。
解决办法:
附加依赖库添加方法有2种。
1、直接在程序中使用宏调用 #pragma comment(lib,"**.lib")
2、在工程属性对话框内的连接器->输入页面中添加依赖项"**.lib"
[解决办法]
你试着传递string fileName,而不是String^ fileName