首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Visual Studio2008的C++中的链接错误

使用Visual Studio2008的C++中的链接错误
EN

Stack Overflow用户
提问于 2014-01-12 02:38:05
回答 2查看 798关注 0票数 0

其他一切看起来都很好,但最后还是出现了链接错误:

代码语言:javascript
复制
1>Finished searching libraries
1>Finished pass 1
1>Generating non-SAFESEH image.
1>Invoking CVTRES.EXE:
1> /machine:x86
1> /verbose
1> /out:"C:\Users\ocuk\AppData\Local\Temp\lnk9464.tmp"
1> /readonly
1> ".\Debug\Virtual functions.exe.embed.manifest.res"
1>Microsoft (R) Windows Resource To Object Converter Version 9.00.21022.08
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>adding resource. type:MANIFEST, name:1, language:0x0409, flags:0x30, size:2048
1>fig10_10.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Circle::print(void)const " (?print@Circle@@UBEXXZ) referenced in function _main
1>fig10_10.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Point::print(void)const " (?print@Point@@UBEXXZ) referenced in function _main
1>C:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Debug\Virtual functions.exe : fatal error LNK1120: 2 unresolved externals
1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm"
1>Virtual functions - 3 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

在添加VERBOSE之后,我得到一个新的错误:

代码语言:javascript
复制
1>------ Rebuild All started: Project: Virtual functions, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'Virtual functions', configuration 'Debug|Win32'
1>Compiling...
1>circle.cpp
1>fig10_10.cpp
1>point.cpp
1>Generating Code...
1>Compiling manifest to resources...
1>Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
1>Copyright (C) Microsoft Corporation.  All rights reserved.
1>Linking...
1>LINK : fatal error LNK1104: cannot open file 'VERBOSE.obj'
1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual    functions\Virtual functions\Debug\BuildLog.htm"
 1>Virtual functions - 1 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

当我尝试构建我的项目时,我得到了以下错误。发生的情况是,我已经编写了新的头文件(除了now virtual中的一个函数之外,它们与旧的头文件相同。根据我正在工作的文本,没有必要修改相应的.cpp文件,所以我只是从上一个项目中复制了它们,方法是单击源文件并选择add existing。然后我转到项目属性/“C/C++”/General并添加了.cpp文件所在的路径,但是我仍然得到显示的链接错误:

代码语言:javascript
复制
 1>------ Build started: Project: Virtual functions, Configuration: Debug Win32 ------     1>Compiling...     1>circle.cpp     1>point.cpp     1>fig10\_10.cpp     1>Generating Code...     1>Linking...     1>fig10\_10.obj : error LNK2019: unresolved external symbol "public: virtual void       \_\_thiscall Circle::print(void)const " (?print@Circle@@UBEXXZ) referenced in function \_main     1>fig10\_10.obj : error LNK2019: unresolved external symbol "public: virtual void \_\_thiscall Point::print(void)const " (?print@Point@@UBEXXZ) referenced in function \_main     1>C:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Debug\Virtual functions.exe   : fatal error LNK1120: 2 unresolved externals     1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm"     1>Virtual functions - 3 error(s), 0 warning(s)     ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
代码语言:javascript
复制
//Fig 10.9:circle.h
 //Circle class contains x-y coordinate pair and radius

#ifndef CIRCLE_H
#define CIRCLE_H

#include "point.h"      //Point class definition

class Circle: public Point{

public:
//default constructor
Circle(int=0, int=0, double=0.0);

void setRadius( double);        //set radius
double getRadius() const;       //return radius

double getDiameter() const;     //return diameter
double getCircumfernce() const; //return circumfernce
double getArea() const;         //return area

virtual void print() const;     //output Circle object

private:
double radius;      //Circle's radius
};

#endif

//Fig. 10.8:point.h
//Point class definition represents an x-y coordinate pair
#ifndef POINT_H
#define POINT_H

class Point{

public:
Point(int=0, int=0);        //default constructor

void setX(int);     //setX in coordinate pair
int getX() const;   //return x in coordinate pair

void setY(int);     //set y in coordinate pair
int getY() const;   //return y from coordinate pair

virtual void print() const;     //output Point object

private:
int x;      //x part of coordinate pair
int y;      //y part of coordinate pair

};


#endif


//Fig 10.4: circle.cpp
// Circle class member-function definitions

#include <iostream>

using std::cout;

#include "circle.h"     //Cicle class definition

//default constructor
Circle::Circle(int xValue, int yValue, double radiusValue):Point (xValue, yValue)//call   base class constructor
{
setRadius(radiusValue);
}//end circle constructor

//set Radius
void Circle::setRadius(double radiusValue)
 {
radius=(radiusValue<0.0?0.0:radiusValue);
}//end fuinction setRadius

//return radius
double Circle::getRadius() const
{
return radius;
}//end finction getRadius

//calculate and return diameter
double Circle::getDiameter() const
{
return 2*getRadius();
}

//calculate and return diameter
double Circle::getCircumference() const
{
return 3.14159*getDiameter();
}

//calculate and return area
double Circle::getArea() const
{
return 3.14159*getRadius()*getRadius();
}//end function getArea

//output Circle object
void Circle::print() const
{
cout << "center = ";
Point::print();     //invoke Point's print function
cout << "; radius = " << getRadius();
}//end function print


//Fig. 10.2:point.cpp
//Point class member function definitions
#include <iostream>

using std::cout;

#include "point.h"      //Point clss deinition

//default constructor
Point::Point(int xValue, int yValue):x(xValue),y(yValue)
{
//empty body
}

//set x in coordinate pair
void Point::setX( int xValue)
{
x=xValue;   //no need for validation
}//end function setX


//return x from coordinate pair
int Point::getX() const
{
return x;
}//end function getX

//set y in coordinate pair
void Point::setY( int yValue)
{
y=yValue;   //no need for validation
}//end function setY


//return y from coordinate pair
int Point::getY() const
{
return y;
}//end function getY

//output Point object
void Point::print() const
{
cout << '[' << getX() << ", " << getY() << ']';

} //end function print


 //Fig. 10.10: fig10_10.cpp
//Introducing polymorphism, virtual functions and dynamic binding

#include <iostream>
using std::cout;
using std::endl;
using std::fixed;

#include <iomanip>

using std::setprecision;

#include "point.h"      //Point class definition
#include "circle.h"     //Circle class definition

int main()
{
Point point(30,50);
Point *pointPtr=0;

Circle circle(120,89,2.7);
Circle *circlePtr=0;

//set floating point precision
cout << fixed <<setprecision(2);

//output objects point and circle using static binding
cout << "Invoking print function on point and circle "
    << "an objects with static binding "
    << "ananPoint: ";
point.print();  //static binding
cout << "anCircle: ";
circle.print(); //static binding

//output pbjects print and cicrle using dynamic binding
cout << "\n\nInvoking print function on point and circle "
    << "\nobjects with dynamic binding";

//aim base-class pointer at base-class object and print
pointPtr=&point;
cout << "\n\nCalling virtual function print with base-class"
    << "\npointer to  a base-class object"
    <<"\ninvokes base-class print function:\n";
pointPtr->print();

//aim derived calss pointer at derived class
//object and print
circlePtr=&circle;
cout << "\n\nCalling virtual function print with "
    <<"\nderived-class pointer to derived class object "
    <<"\ninvokes derived class print function:\n";
circlePtr->print();

//aim-base calss pointer at derive class object and print
pointPtr=&circle;
cout << "\n\nCalling virtual function print with base-class"
    << "\npointer to derived class object "
    <<"\ninvokes derived class print function:\n";
pointPtr->print();      //polymorphiosm invokes ciecle's print
cout << endl;

return 0;

}
EN

回答 2

Stack Overflow用户

发布于 2014-01-12 02:40:44

井,

代码语言:javascript
复制
Circle::print(void)
Point::print(void)

不会被链接器发现。这意味着要么

  • 未生成函数代码
  • 您忘记了要链接的.lib文件(请查看项目属性->链接->其他依赖项的输入)

这些都是虚函数,请确保它们是在您的类中的某个位置实现的(如果您想要多态性,则必须在派生类中覆盖它们)。一个纯虚函数可以在最后用“=0”声明,但在这种情况下,你必须在一个派生类中手动实现它。

代码后更新:

你的代码在我看来没问题,只有一个语法错误:

代码语言:javascript
复制
double getCircumfernce() const; //return circumfernce

这阻止了编译。请务必将其更正。

还有:只是为了确认一下..您是否将每段代码放入一个单独的文件中,不是吗?如果您将整个代码放入一个.cpp文件中,您将获得

代码语言:javascript
复制
1>------ Build started: Project: ConsoleApplication2, Configuration: Debug Win32 ------
1>  ConsoleApplication2.cpp
1>ConsoleApplication2.obj : error LNK2005: "public: __thiscall Circle::Circle(int,int,double)" (??0Circle@@QAE@HHN@Z) already defined in circle.obj
1>ConsoleApplication2.obj : error LNK2005: "public: __thiscall Point::Point(int,int)" (??0Point@@QAE@HH@Z) already defined in point.obj

还有很多其他的链接错误..

其他更开放的问题:

  • 确保诸如防病毒或防御者之类的东西不会妨碍编译过程(它们可能会阻止MS链接器完成其任务)
  • 确保您具有读/写权限(或以administrator)
  • Make身份运行VS以确保VS通过如下所述启用/VERBOSE编译标志来找到所有文件(circle.obj、point.obj和fig10_10.obj
票数 2
EN

Stack Overflow用户

发布于 2014-01-12 02:51:21

我能猜出有两个原因。

1)在旧版本中,你的程序函数print只在基类中定义。现在,您将此函数添加到派生类Point和Circle中。但是您忘记了在cpp模块中定义它们。对于这些类

2)也许您为这些函数添加了限定符const,而旧函数没有限定符const。您又一次忘记了更改cpp模块中函数的定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21066308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档