读书人

求救-vc.net包装非托管类编译失败,该怎

发布时间: 2012-01-19 20:57:59 作者: rapoo

求救-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

读书人网 >VC

热点推荐