我创建了一个MFC DLL 工程,输出文件选择的在项目-》属性-》配置属性下的常规选项下的配置类型选择的是“动态库(.dll)”
在工程里添加了一个类,在类的声明前加上了 AFX_EXT_CLASS宏
编译通过后lib文件只有1k多,dll 1M多(DEBUG版)(是不是有点小啊,我看到的例子几十K的DLL,的lib已有几十K啊)在另一个工程中使用,把lib和dll文件拷贝到工程目录下,静态加载这个DLL 方法是我在类的头文件上加了
#pragma comment(lib,"Mylib.lib")
可是编译后连接时报连接错误错误号2001,2019,好像是找不到类中函数的实现。
为什么啊?是不是我生成的lib文件有问题啊。
如果我在dll工程中选择输出静态库,这个lib文件可以使用。

解决方案 »

  1.   

    MFC DLL我没用过,因为一般DLL都是算法和功能函数,而MFC和ANSI C、STD C++的兼容性又很好,所以一般编成标准DLL就行了,更通用,更小巧,所有的类、公用函数声明前面加上__declspec(dllexport)就行了
      

  2.   

    是不是我工程设置有问题啊,为什么lib文件这么小。这个宏AFX_EXT_CLASS  就是声明定义的类为导出类的
      

  3.   

    一般lib也就几k..先看你的类是否正确导出
      

  4.   

    怎么看啊,可是我手头上的1M多的和几十K的DLL他门的lib文件有几十K
      

  5.   

    你试试release版的dll多大,1k确实太小,说明你可能很多DLL入口点没声明,我的经验一般dll几百k时lib即使k
      

  6.   

    你试试所有的公共函数前全加上__declspec(dllexport),这个前缀应该是通用的;如果没用到CString之类的MFC专有的东西就直接编成标准DLL吧
      

  7.   

    我看了一下 AFX_EXT_CLASS的定义发现什么也没有。最后改用__declspec(dllexport)lib 6K成功了
    这是为什么啊 AFX_EXT_CLASS 怎么什么都没有...........
      

  8.   

    AFX_EXT_CLASS 这个是一个宏,你搜索它的定义的地方,估计有define 宏没有打开
      

  9.   

    新的问题有出现了,我想调试dll里的函数,发现调用时传进去的char* 类型的参数是空,但看参数的地址是我传进去的那个参数的地址,当函数退出时执行的结果是对的。int 行的参数就没问题,我改怎么做呢,怎样才能看到参数的正确值。
      

  10.   

    都是程序的问题,你不贴代码,别人也不知道你具体哪里没写对。AFX_EXT_CLASS宏是怎么加的,函数如何定义、声明和调用的?
      

  11.   

    dll 头文件
    class _declspec(dllexport)CFunction : public CObject
    {
    public:
          CFunction();
          virtual ~CFunction();
          int Add(int a, int b);
          char* Link(char* stra , char* strb);
    };dll cpp
    int CFunction::Add(int a ,int b)
    {
         return a + b;
    }char* CFuntion::Link(char* stra, char* strb)
    {
         return strcat(stra, strb);
    }调用
    把Function.h加到工程里面
    加上 #pragma comment(lib,“DLLpro。lib”)

    在其他文件包含该头文件
    声明一个对象
    CFunction m_cMyFunction
    调用
    int a = 10;
    int b = 10;
    int c = cMyFunction.Add(a,b);
    结果 c = 20 调试在CFunction里面的Add函数传近的参数正确char* stra[100];
    char* strb[100];
    memset(stra,'\0',100);
    memset(strb,'\0',100);
    strcpy(stra,"0123456789");
    strcpy(stra,"abcdefg");
    stra = cMyFunction.Link(stra,strb);
    结果 stra = 0123456789abcdefg 调试时在CFunction里面的Link函数传近的参数字符串为空
    但如果在Link函数里加上
    char* temp[100];
    memset(temp,'\0',100);
    strcpy(temp,stra);
    拷贝后的temp = 0123456789
      

  12.   

    char stra[100]; 
    char strb[100]; 
    char temp[100];
    上面的代码变量声明写错了