一般我在写动态库的时候,自己调试通过以后,都是把Release版本的给别人用,但是近来我写的动态库还有周围同事写的动态库都莫名其妙的出现了只有Release版本的程序才能调用Release版本的动态库,Debug版本的程序才能调用Debug的动态库。这样的话就必须准备两种版本供使用者调用,带来了诸多的不便。请问是什么原因造成的,有什么解决办法。

解决方案 »

  1.   

    你看看你程序中的debug宏是不是有些交叉,如果这个比较混乱,就会造成这个问题。
      

  2.   

    当然不是应该这样!你用Debug版本的Exe有没有问过微软要Debug版的Kernel32.dll?
    肯定是导出函数时参数中有类作为参数。MFC的类也是类。。
    是不是导出了类?
    还有,不要在一个DLL中malloc的内存由另外一个DLL释放。如果只导出函数,并且函数的参数中没有类只有指针的话
    只提供Release版是没有问题的。
      

  3.   

    wuxuan(真心英雄):
    想请教一下“ debug宏是不是有些交叉”,具体情况,烦请举个例子。谢谢!
      

  4.   

    应该就是这样
    只有Release版本的程序才能调用Release版本的动态库,Debug版本的程序才能调用Debug的动态库.
      

  5.   

    一般情况下都应该是这样的。至于你那里出现问题,估计是内存分配的问题,debug版本的内存分配和release的内存分配不一样。如果一个在debug模式下编译的模块分配的内存在一个release模式编译的模块下释放,没有问题才怪。
      

  6.   

    没有写完就发了:)
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endifdebug模式下new分配实际上是调用了DEBUG_NEW,这和release模式下不一样,
    这是可能的问题所在。
      

  7.   

    我用RELEASE版本的DLL,在DEBUG状态下调试它,发现有些变量根本就不变化。
      

  8.   

    我是菜鸟,没听说过DEBUG版本可以在RELEASE版本下用的,关注,学习!
      

  9.   

    本来就是这样嘛。MFC的DLL还分debug版和release版呢。
      

  10.   

    是的.严格来说APP的DEBUG版用DLL的DEBUG版.RELEASE 版的APP用RELEASE的DLL.不过你交叉用的话不一定出错. MS系统的DLL很多都有D版的.
      

  11.   

    严格来说APP的DEBUG版用DLL的DEBUG版????从来没有这种说法。我不知道哪位兄弟有Debug版的Kernel32.dll,
    User32.dll,Gdi32.dll在利用第3方软件提供的DLL时,没听说过一定要提供Debug版本。难道现在就没有人用SDK写过DLL吗。我从来就没有要求别人
    给我提供什么Debug版本的DLL,除非我怀疑他的程序有问题。
    这时我还要求他提供代码呢。
    >debug模式下new分配实际上是调用了DEBUG_NEW,这和release模式下不一样,
    >这是可能的问题所在。一般没有这个问题,除非你在A.DLL中申请内存,在B.DLL中释放。
    但这样就违反了DLL中申请内存的原则,应该避免这种做法。
      

  12.   

    恩..也许你是对的,我承认这个问题我没有仔细考虑过. 应该说debug和releas版实质都是一样的,只是debug没有任何优化,增加了很多除错信息(大量的判断结构)D版的DLL只是为了调试的需要.