none
是否可以在WIN32/mfc 动态链接库中调用c的静态库 RRS feed

  • 问题

  • 如题,我有一个纯C的(非c++)静态库(.lib),里面有一些函数,我现在可以在vc++应用程序中调用这个库的函数实现我的功能,问题是我现在要在c#中调用这个库中函数,我的想法是在vc++中创建一个动态库(dll),调用静态库的功能,然后再在c#中调用该动态库,请问是否可以实现,我现在总是失败,如不能实现,该怎么解决?


       
    2010年3月23日 8:22

答案

  • cst_voice *REGISTER_VOX(const char *voxdir);
    函数的实现没有找到,和你写得导出函数没有关系。用隐式加载静态库试一下
    麻烦把正确答案设为解答。
    • 已标记为答案 Nancy Shao 2010年3月30日 8:03
    2010年3月26日 2:06
    版主

全部回复

  • 啥错误提示?
    2010年3月23日 8:43
    版主
  • 我对vc++不熟悉,所以无法准确定义什么错误,我这里有软件包,请问是否可以帮我看一下是否可以把用到的lib库添加到一个dll文件中,我准备在c#中调用dll以实现我的功能,主要是c#无法调用.lib库。

    下面是我的一个可以运行的EVC程序的代码,包含了要用到的4个库文件,以及所有的头文件,主要的功能都在play.c文件中。include 文件夹是要包含的头文件目录

    http://mail.qq.com/cgi-bin/ftnExs_download?k=0834666571ef8ecc3d006c6a4764051c500650035151510a1851570659490307500c4b5d5455011e04025203055500510c56575d616d3775595d12004f16564135&t=exs_ftn_download&code=54fead73

    谢谢。

    2010年3月23日 9:27
  • 没有人回复吗,呜呜。

     

    主要想要实现play。c文件中的功能,打包到dll中

    #include <windows.h>
    #include <tchar.h>
    
    #include "flite.h"
    #include "voxdefs.h"
    
    #pragma comment(lib, "cmu_us_kal.lib")
    #pragma comment(lib, "cmutex.lib")
    #pragma comment(lib, "flitelib.lib")
    #pragma comment(lib, "usenglish.lib")
    
    
    cst_voice *REGISTER_VOX(const char *voxdir);
    cst_voice *UNREGISTER_VOX(cst_voice *vox);
    
    cst_voice *g_v;
    
    
    
    void SayInit()
    {
       flite_init();
       g_v = REGISTER_VOX(NULL);
    }
    
    void SayDone()
    {
       UNREGISTER_VOX(g_v);
    }
    
    BOOL SayIt(LPSTR pstrText, LPSTR pstrFilename)
    {
       if( g_v == NULL ) {
          MessageBeep((UINT)-1);
          return FALSE;
       }
       flite_text_to_speech(pstrText, g_v, pstrFilename);
       return TRUE;
    }
    
    但,

    cst_voice *REGISTER_VOX(const char *voxdir);
    cst_voice *UNREGISTER_VOX(cst_voice *vox);

    cst_voice *g_v;


    这里的使用好像有问题

    我试图这样定义一个导出函数
    extern "C" __declspec(dllexport) int SayInit(void)
    {
    flite_init();
    g_v=REGISTER_VOX(NULL);
    return 0;
    }

    就会给出

    DllTEST.obj : error LNK2019: unresolved external symbol "struct cst_voice_struct * __cdecl register_cmu_us_kal(char const *)" (?register_cmu_us_kal@@YAPAUcst_voice_struct@@PBD@Z) referenced in function _SayInit
    的错误。


    我这样定义是不是错了,是否应该是先导出
    extern "C" __declspec(dllexport) int WrapperCallflite_init()
    {
    return flite_init();
    }
    这样的原始函数?

    那么上面的2个函数
    cst_voice *REGISTER_VOX(const char *voxdir);
    cst_voice *UNREGISTER_VOX(cst_voice *vox);

    该如何解决呢,没有头文件中声明了这两个函数,仅仅在

    voxdefs.h 中这样定义了函数名的预处理命令而已
    #define VOXNAME cmu_us_kal
    #define REGISTER_VOX register_cmu_us_kal
    #define UNREGISTER_VOX unregister_cmu_us_kal
    #define VOXHUMAN "Kevin"
    #define VOXGENDER "male"
    #define VOXVERSION 1.1
    
    Thanks
    2010年3月24日 3:22
  • cst_voice *REGISTER_VOX(const char *voxdir);
    函数的实现没有找到,和你写得导出函数没有关系。用隐式加载静态库试一下
    麻烦把正确答案设为解答。
    • 已标记为答案 Nancy Shao 2010年3月30日 8:03
    2010年3月26日 2:06
    版主