我建了一个dll工程。在下面建了一个文件夹,里面有两个文件MiKi_A.h , MiKi_C.h 两个类//MiKi_A.h
#pragma once
#ifndef MIKIA
#define EXT _declspec(dllexport)
#else 
#define EXT _declspec(dllimport)
#endif
class EXT MiKi_A
{
public:
MiKi_A(void);
virtual int add();
public:
virtual ~MiKi_A(void);
};//MiKi_C.h
#pragma once
#define MIKIA
#include "MiKi_A.h"class MiKi_C :public MiKi_A {
public:
MiKi_C(void);
int add(){ return 0; }
public:
virtual ~MiKi_C(void);
};
请问为什么链接的时候会出现错误?
1>MiKi_C.obj : warning LNK4217: locally defined symbol ??1MiKi_A@@UAE@XZ (public: virtual __thiscall MiKi_A::~MiKi_A(void)) imported in function __unwindfunclet$??0MiKi_C@@QAE@XZ$0
1>MiKi_C.obj : warning LNK4217: locally defined symbol ??0MiKi_A@@QAE@XZ (public: __thiscall MiKi_A::MiKi_A(void)) imported in function "public: __thiscall MiKi_C::MiKi_C(void)" (??0MiKi_C@@QAE@XZ)
1>MiKi_A.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MiKi_A::add(void)" (?add@MiKi_A@@UAEHXZ)
1>D:\Lenka\lenka\Debug\MiKi.dll : fatal error LNK1120: 1 unresolved externals他提示说找不到A的虚函数。我这么分析的:
在MiKi_A.h 编译的时候,#define EXT _declspec(dllexport)
即此时的obj文件是导出文件。
然后在MiKi_C.h文件链接的时候,包含的头文件是EXT _declspec(dllimport)的,好像没问题呀?

解决方案 »

  1.   

    一般导出接口,而不是类如果需要导出类,用lib
      

  2.   


    十分谢谢,但是导出接口的话要怎么访问接口呢?
    比如我下面的类如果把add变成为一个纯虚函数,那么MiKi_A就是一个抽象类了,也就是接口。
    很显然我如果导出他的话,在另一个exe文件中要使用这个add接口函数,必须先定义一个对象,然后通过对象来调用add,这个对象不就又需要导出他的继承类class MiKi_C来创建么?
    最后还不是最底层的实现类被导出来了?
    class EXT MiKi_A
    {
    public:
    MiKi_A(void);
    virtual int add()=0;
    public:
    virtual ~MiKi_A(void);
    };
      

  3.   

    class EXT MiKi_A应该有生成lib文件,class MiKi_C需要使用这个lib文件。你的头文件定义没有问题,所以编译没有错。但是链接的时候缺少了lib文件,所以链接器报错。导入lib文件,VC6下是在Project Settings-》Link-》Object/library modules里面进行添加ouyh12345说的导出接口应该说的是导出函数的意思。