none
在MFC中 导出DLL函数的问题 RRS feed

  • 问题

  •     ShowDLLDlg @ 1//这句话是对的   为什么下面两个是错的 呢? 
        Add @ 2
        Dec @ 3


    void ShowDLLDlg()
    {
     AFX_MANAGE_STATE(AfxGetStaticModuleState());
     CDialog dlg(IDD_DIALOG1);
     dlg.DoModal();
    }
    int Add(int a,int b)
    {
     return a+b;
    }
    int Dec(int a,int b)
    {
     return a-b;
    }

    提示一大堆错误 如何解决啊?

    1>MFCDLL1.def : warning LNK4022: 找不到符号“Add”的唯一匹配项
    1>MFCDLL1.def : warning LNK4002: "int __cdecl Add(int,int)" (?Add@@YAHHH@Z) 在 .\Release\MFCDLL1.obj 中定义
    1>MFCDLL1.def : warning LNK4002: "public: virtual void __thiscall CMFCRibbonMainPanel::Add(class CMFCRibbonBaseElement *)" (?Add@CMFCRibbonMainPanel@@UAEXPAVCMFCRibbonBaseElement@@@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfc90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: virtual void __thiscall CMFCRibbonPanel::Add(class CMFCRibbonBaseElement *)" (?Add@CMFCRibbonPanel@@UAEXPAVCMFCRibbonBaseElement@@@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfc90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "protected: void __thiscall CMFCRibbonQuickAccessToolBar::Add(class CMFCRibbonBaseElement *)" (?Add@CMFCRibbonQuickAccessToolBar@@IAEXPAVCMFCRibbonBaseElement@@@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfc90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: virtual void __thiscall CRecentFileList::Add(unsigned short const *)" (?Add@CRecentFileList@@UAEXPBG@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfc90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: virtual void __thiscall CRecentFileList::Add(wchar_t const *)" (?Add@CRecentFileList@@UAEXPB_W@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfc90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: unsigned int __thiscall ATL::CAtlArray<void *,class ATL::CElementTraits<void *> >::Add(void *)" (?Add@?$CAtlArray@PAXV?$CElementTraits@PAX@ATL@@@ATL@@QAEIPAX@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\mfcs90u.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: int __thiscall ATL::CSimpleArray<unsigned long,class ATL::CSimpleArrayEqualHelper<unsigned long> >::Add(unsigned long const &)" (?Add@?$CSimpleArray@KV?$CSimpleArrayEqualHelper@K@ATL@@@ATL@@QAEHABK@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\atls.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: int __thiscall ATL::CSimpleArray<struct HINSTANCE__ *,class ATL::CSimpleArrayEqualHelper<struct HINSTANCE__ *> >::Add(struct HINSTANCE__ * const &)" (?Add@?$CSimpleArray@PAUHINSTANCE__@@V?$CSimpleArrayEqualHelper@PAUHINSTANCE__@@@ATL@@@ATL@@QAEHABQAUHINSTANCE__@@@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\atls.lib 中定义
    1>MFCDLL1.def : warning LNK4002: "public: int __thiscall ATL::CSimpleArray<struct CTraceSnapshot::CModuleInfo,class ATL::CSimpleArrayEqualHelper<struct CTraceSnapshot::CModuleInfo> >::Add(struct CTraceSnapshot::CModuleInfo const &)" (?Add@?$CSimpleArray@UCModuleInfo@CTraceSnapshot@@V?$CSimpleArrayEqualHelper@UCModuleInfo@CTraceSnapshot@@@ATL@@@ATL@@QAEHABUCModuleInfo@CTraceSnapshot@@@Z) 在 D:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\lib\atls.lib 中定义
    1>MFCDLL1.def : error LNK2001: 无法解析的外部符号 Add
    1>D:\VC++\MFCDLL1\Release\MFCDLL1.lib : fatal error LNK1120: 1 个无法解析的外部命令
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月13日 8:55

答案

全部回复

  • 是用了def文件导出Add的函数吧?
    需要在Add前面加上__declspec(dllexport)
    2009年8月13日 9:17
  • 还是不得行  extern "C" _declspec(dllexport) int Add(int a,int b)   。。

    .\MFCDLL1.def(8) : fatal error LNK1118: “"C"”语句中的语法错误


    VC++2008 的
    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月13日 10:20
  • 不要def文件
    直接
    int _declspec(dllexport) Add(int a,int b)
    {
     return a+b;
    }
    int _declspec(dllexport) Dec(int a,int b)
    {
     return a-b;
    }


    0xBAADF00D
    • 已标记为答案 dowflyon 2009年8月13日 13:48
    2009年8月13日 12:16
    版主
  • 谢谢  已编译通过 但是 我在 其他语言 非VC中
    调用 
    extern "C" _declspec(dllexport) int Add(int a,int b)
    {
     return a+b;
    }

    extern "C" _declspec(dllexport) int Dec(int a,int b)
    {
     return a-b;
    }

    为何无法正确调用? 


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月13日 13:54
  • 谢谢  已编译通过 但是 我在 其他语言 非VC中
    调用 
    extern "C" _declspec(dllexport) int Add(int a,int b)
    {
     return a+b;
    }

    extern "C" _declspec(dllexport) int Dec(int a,int b)
    {
     return a-b;
    }

    为何无法正确调用? 


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月13日 13:54
  • _declspec(dllexport)是VC特有关键字
    0xBAADF00D
    2009年8月13日 17:50
    版主
  • 哦 我刚才问了那些 做开发的 他们说 只支持stdcall   必须把  函数写在 DEF 中  如何做?


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月14日 6:18
  • extern "C" _declspec(dllexport) int __stdcall Add(int a,int b)
    • 已标记为答案 dowflyon 2009年8月14日 7:22
    2009年8月14日 6:19
  • 谢谢 解决了!


    …|▌'寔堅蔃の/「≯還寔╪.逞蔃﹖
    2009年8月14日 7:28