【问题标题】:Linking Error in C++ using Visual Studio 2008使用 Visual Studio 2008 的 C++ 中的链接错误
【发布时间】:2014-01-11 18:38:05
【问题描述】:

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

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 文件所在的路径,但是我仍然得到显示链接错误:

1>------构建开始:项目:虚拟功能,配置:调试Win32 ------ 1>编译... 1>圆.cpp 1>点.cpp 1>fig10_10.cpp 1>生成代码... 1>链接... 1>fig10_10.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Circle::print(void)const" (?print@Circle@@UBEXXZ) 在函数 _main 中引用 1>fig10_10.obj : error LNK2019: unresolved external symbol "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 : 致命错误 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;

}

【问题讨论】:

  • 发布一些代码会很棒。
  • 修改了我的答案:stackoverflow.com/a/21066343/1938163
  • 您是否尝试过完全重新编译? Ctrl+Alt+F7,你也可以张贴你的 C/C++/General 和 Linking 选项卡的屏幕截图吗?
  • 添加了一些其他信息,这应该会限制问题。
  • 嘿,你看到我更新的问题了吗?

标签: c++ visual-studio-2008


【解决方案1】:

嗯,

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

链接器找不到。这意味着要么

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

这些是虚函数,请确保它们在你的类中的某个地方实现(如果你想要多态,那么你必须在派生类中覆盖它们)。纯虚函数可以在末尾用“=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

【讨论】:

  • 我应该添加什么 .lib 文件?
  • 查看我为旧项目列出的项目属性。也许您忘记了需要在新项目中添加的 .lib 文件。只是一个猜测,否则发布一些代码
  • 是的,我已将它们添加到单独的文件中,项目结构显示在我添加到原始问题的图片中
  • 我将 VERBOSE(只需键入)添加到链接器属性页面上显示的框中。现在似乎产生了一个新错误?
  • 你忘记了“/”吗?它将“详细”文本视为另一个库。它应该使用此处所述的“/VERBOSE”命令:msdn.microsoft.com/en-us/library/wdsk6as6(v=vs.110).aspx
【解决方案2】:

我可以猜到两个原因。

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

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

【讨论】:

  • 您好,重点是案例类,所有打印函数都有限定符 const
  • 还要检查函数定义中函数名前是否有类名。例如,定义必须看起来像 void Circle::print() const { /* function body */ }
猜你喜欢
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2010-11-05
  • 2021-07-02
相关资源
最近更新 更多