none
error LNK2019: 无法解析的外部符号 RRS feed

  • 问题

  • 使用visual C++2008,新建项目->Win32 项目->静态库->完成,lib代码如下:
    circle.h文件内容如下:

    #ifndef CIRCLE_H
    #define CIRCLE_H
    #include "point.h" 
    #ifdef DLL_FILE
    class _declspec(dllexport) circle //导出类circle
    #else
    class _declspec(dllimport) circle //导入类circle
    #endif
    {
    public:
     void SetCentre(const point &centrePoint);
     void SetRadius(float r);
     float GetGirth();
     float GetArea();
     circle();
    private:
     float radius;
     point centre;
    };
    #endif
    

    point.h文件内容如下:

    ifndef POINT_H
    #define POINT_H
    #ifdef DLL_FILE
    class _declspec(dllexport) point //导出类point
    #else
    class _declspec(dllimport) point //导入类point
    #endif
    {
    public:
     float y;
     float x;
     point();
     point(float x_coordinate,float y_coordinate );
    };
    #endif
    

    circle.cpp文件内容如下:

    #ifndef DLL_FILE
    #define DLL_FILE
    #endif
    #include "circle.h"
    #define PI 3.1415926
    circle::circle ()
    {
     centre = point(0,0);
     radius = 0;
    }
    
    float circle::GetArea()
    {
    	return PI*radius*radius;
    }
    
    float circle::GetGirth()
    {
     return 2*PI*radius;
    }
    
    void circle::SetCentre(const point &centrePoint)
    {
    
    centre = centrePoint;
    
    }
    
    void circle::SetRadius(float r)
    {
    
    radius = r;
    
    }
    
    
     point.cpp文件内容如下:
    #ifndef DLL_FILE
    #define DLL_FILE
    #endif
     
    #include "circle.h"
    #define PI 3.1415926
    circle::circle ()
    {
       centre = point(0,0);
       radius = 0;
    }
    float circle::GetArea()
    {
     return PI*radius*radius;
    }
    float circle::GetGirth()
    {
        return 2*PI*radius;
    }
    void circle::SetCentre(const point &centrePoint)
    {
     centre = centrePoint;
    }
    void circle::SetRadius(float r)
    {
     radius = r;

    调用lib的程序如下:

    #include "stdafx.h"
    #include "..\\dllTest1\\circle.h"
    #include "..\\dllTest1\\point.h"
    #pragma comment(lib,"..\\dllTest1\\Debug\\dllTest1.lib")
    int _tmain(int argc, _TCHAR* argv[])
    {
    
     circle c;
     point p(2.0,2.0);
     c.SetCentre(p);
     c.SetRadius(1.0);
     printf("area:%f girth:%f ",c.GetArea(),c.GetGirth());
     return 0;
    
    } 

    编译时产生错误:
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: float __thiscall circle::GetArea(void)" (__imp_?GetArea@circle@@QAEMXZ),该符号在函数 _wmain 中被引用
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: float __thiscall circle::GetGirth(void)" (__imp_?GetGirth@circle@@QAEMXZ),该符号在函数 _wmain 中被引用
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall circle::SetRadius(float)" (__imp_?SetRadius@circle@@QAEXM@Z),该符号在函数 _wmain 中被引用
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: void __thiscall circle::SetCentre(class point const &)" (__imp_?SetCentre@circle@@QAEXABVpoint@@@Z),该符号在函数 _wmain 中被引用
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall point::point(float,float)" (__imp_??0point@@QAE@MM@Z),该符号在函数 _wmain 中被引用
    1>callDLL.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall circle::circle(void)" (__imp_??0circle@@QAE@XZ),该符号在函数 _wmain 中被引用
    1>F:\net\vc\callDLL\Debug\callDLL.exe : fatal error LNK1120: 6 个无法解析的外部命令

    是什么原因产生的错误,如何修改代码?

    2010年5月19日 4:42

答案

  • 抱歉,由于你使用的是静态库,不需要添加_declspec。只有动态连接库才需要添加这个修饰符

    改为

    #ifndef CIRCLE_H
    #define CIRCLE_H
    #include "point.h"
    class circle
    {
    public :
    void SetCentre(const point &centrePoint);
    void SetRadius(float r);
    float GetGirth();
    float GetArea();
    circle();
    private :
    float radius;
    point centre;
    };
    #endif

    point.h文件内容如下:

    #ifndef POINT_H
    #define POINT_H
    class point
    {
    public :
    float y;
    float x;
    point();
    point(float x_coordinate,float y_coordinate );
    };
    #endif

    麻烦把正确答案设为解答。
    • 已标记为答案 carnation 2010年5月21日 1:16
    2010年5月20日 10:11
    版主

全部回复

  • 估计是 Linker 里面少连接一个 .lib 文件。如果你是用 GDI+,参考下面:

    http://www.23book.net/SoftwareDev/VC/27093.htm

    2010年5月19日 6:29
  • 缺少circle各个方法的实现。

    在circle.cpp中要像point.cpp那样写成员函数的实现,而不是再次定义一次。


    麻烦把正确答案设为解答。
    • 已标记为答案 carnation 2010年5月20日 0:36
    • 取消答案标记 carnation 2010年5月20日 0:42
    2010年5月19日 9:45
    版主
  • 缺少circle各个方法的实现。

    在circle.cpp中要像point.cpp那样写成员函数的实现,而不是再次定义一次。


    麻烦把正确答案设为解答。


    已经在circle.cpp中实现了成员函数,可以还是上面的错误,在VC6.0中可以正常编译通过,在VC2008中却提示上面的错误,是不是VC2008的编辑器在生成lib文件和编辑调用Dll的文件时需要设置什么参数?

    谢谢!

    2010年5月20日 0:57
  • 在你的Lib文件中,看能否找到GetArea@circle@@QAEMXZ等这样的名字符号
    麻烦把正确答案设为解答。
    2010年5月20日 2:41
    版主
  • 在你的Lib文件中,看能否找到GetArea@circle@@QAEMXZ等这样的名字符号
    麻烦把正确答案设为解答。

    使用UltraEdit打开lib文件,可以找到GetArea@circle@@QAEMXZ,为什么调用lib的程序会编译不通过呢? 如何解决?谢谢!
    2010年5月20日 2:52
  • 抱歉,由于你使用的是静态库,不需要添加_declspec。只有动态连接库才需要添加这个修饰符

    改为

    #ifndef CIRCLE_H
    #define CIRCLE_H
    #include "point.h"
    class circle
    {
    public :
    void SetCentre(const point &centrePoint);
    void SetRadius(float r);
    float GetGirth();
    float GetArea();
    circle();
    private :
    float radius;
    point centre;
    };
    #endif

    point.h文件内容如下:

    #ifndef POINT_H
    #define POINT_H
    class point
    {
    public :
    float y;
    float x;
    point();
    point(float x_coordinate,float y_coordinate );
    };
    #endif

    麻烦把正确答案设为解答。
    • 已标记为答案 carnation 2010年5月21日 1:16
    2010年5月20日 10:11
    版主