c++ - 使用 Visual Studio 2008 在 C++ 中链接错误

标签 c++ visual-studio-2008

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

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 后出现新错误:

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 ==========

当我尝试构建我的项目时遇到以下错误。发生的事情是我编写了新的头文件(与旧的头文件相同,除了现在虚拟的一个功能。根据我正在工作的文本,不需要修改相应的 .cpp 文件,所以我只是通过单击源文件并选择添加现有项目,从以前的项目中复制了它们。然后我转到项目属性/"C/C++"/General 并添加了 .cpp 文件所在的路径,但是我仍然得到显示链接错误:

enter image description here 1>------ 构建开始:项目:虚拟功能,配置:调试 Win32 ------ 1>编译... 1>圆.cpp 1>点.cpp 1>图10_10.cpp 1>正在生成代码... 1>链接... 1>fig10_10.obj : error LNK2019: 未解析的外部符号 "public: virtual void __thiscall Circle::print(void)const "(?print@Circle@@UBEXXZ) 在函数 _main 中引用 1>fig10_10.obj : error LNK2019: 未解析的外部符号 "public: virtual void __thiscall Point::print(void)const "(?print@Point@@UBEXXZ) 在函数 _main 中引用 1>C:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Debug\Virtual functions.exe : fatal error LNK1120: 2 unresolved externals 1>构建日志保存在“file://c:\Users\ocuk\Documents\C++\Chapter 10\Virtual functions\Virtual functions\Debug\BuildLog.htm” 1>虚函数 - 3 个错误,0 个警告 ========== 构建:0 成功,1 失败,0 最新,0 跳过 ==========

//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;

}

最佳答案

嗯,

Circle::print(void)
Point::print(void)

没有被链接器找到。这意味着要么

  • 未生成函数代码
  • 您忘记了要链接的 .lib 文件(检查 project properties->Linking->Input 以获得额外的依赖项)

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


代码后更新:

我觉得你的代码没问题,这里只有一个语法错误:

double getCircumfernce() const; //return circumfernce

阻止编译。确保更正它。

另外:只是为了确定.. 您是否将每段代码放入一个单独的文件中,不是吗?如果你把这整个东西放到一个 .cpp 文件中,你会得到

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 链接器完成其任务)
  • 确保您具有读/写权限(或以管理员身份运行 VS)
  • 通过启用 /VERBOSE 编译标志确保 VS 找到所有 .obj 文件(circle.obj、point.obj 和 fig10_10.obj,如下所述:http://msdn.microsoft.com/en-us/library/wdsk6as6(v=vs.110).aspx

关于c++ - 使用 Visual Studio 2008 在 C++ 中链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066308/

相关文章:

c++ - "return *this"赋值运算符重载

c - 如何使用 cvGetCaptureProperty 检索视频格式

c++ - 用于发送电子邮件的命令行 C++ 程序

.net - 诊断为什么 DebuggerTypeProxy 属性不起作用

visual-studio - 是否可以打开 VS2010、2008 和 2005 并编辑同一个项目?

c++ - 为什么答案不显示

c++ - 使用已删除的 shared_ptr 中的原始指针的未定义行为?

.net - 在 Visual Studio 中关闭 WCF 服务主机

c++ - 为我的 C++ 应用程序提供 SDK

c++ - 为什么 TRACE 会停止运行?