c++ - 架构x86_64的未定义符号: 在 shape.o 中,"Shape::get_area()",引用来自:votable

  显示原文与译文双语对照的内容
0 0

我非常确定我的问题是一些笨重的事,但我无法找出我的生命。 我有这个家庭作业,基本上是为了加强我们在课堂( 这是 C++,顺便说一下) 中学习多态性的方法。 这个程序的基础是一个名为shape的类,它是圆。三角形和 rectangle的父类。

使用纯虚方法 get_area() 获取链接器错误,该方法将在子类中定义。 我不能找出为什么它不会编译,我甚至没有使用它,它本质上是一种原型方法。

这里是 shape.h file:的代码

#ifndef Assign8_Shape_h
#define Assign8_Shape_h
#include <iostream>
#include <stdio.h>
#include <string>
using namespace::std;
class Shape{
private:
 string color;
public:
 Shape(const string& n_color);
 virtual ~Shape ();
 void print();
 virtual double get_area() = 0;
};
#endif

这里是 Shape.cpp file:

#include <stdio.h>
#include <string>
#include"Shape.h"
using namespace::std;
Shape::Shape(const string& n_color) {
 color = n_color;
}
Shape::~Shape (){
}
void Shape::print() {
 cout <<color;
}

下面是在 Circle.h 中如何覆盖有问题的方法的示例:

#ifndef __Assign8__Circle__
#define __Assign8__Circle__
#include <stdio.h>
#include <string>
#include"Shape.h"
using namespace::std;
class Circle : public Shape
{
public:
 Circle(const string& n_color, int n_radius);
 void print();
 double get_area();
private:
 int radius;
};

然后在 Circle.cpp 中:

#include"Circle.h"
using namespace::std;
Circle::Circle(const string& n_color, int n_radius) : Shape(n_color) {
 radius = n_radius;
}
void Circle::print(){
 Shape::print();
 cout <<", radius" <<radius <<" area" <<get_area();
}
double Circle::get_area() {
 double pi = 3.14159265359;
 return pi * (radius * radius);
}

下面是错误的全部内容:

Ld/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Products/Debug/Assign8 normal x86_64
 cd/Users/username/Documents/NIU/CSCI241/Assign8
 export MACOSX_DEPLOYMENT_TARGET=10.9
/Applications/Utilities/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot/Applications/Utilities/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -L/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Products/Debug -F/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Products/Debug -filelist/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Intermediates/Assign8.build/Debug/Assign8.build/Objects-normal/x86_64/Assign8.LinkFileList -mmacosx-version-min=10.9 -stdlib=libc++ -Xlinker -dependency_info -Xlinker/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Intermediates/Assign8.build/Debug/Assign8.build/Objects-normal/x86_64/Assign8_dependency_info.dat -o/Users/username/Library/Developer/Xcode/DerivedData/CSCI241-dhkihmradodwdkerbhwjkshakexl/Build/Products/Debug/Assign8
Undefined symbols for architecture x86_64:
"Shape::get_area()", referenced from:
 vtable for Shape in Shape.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
时间:原作者:7个回答

0 0

你的代码在 G++ 版本 4.8.2上编译时没有问题:

$ g++ -o c Circle.cpp Shape.cpp
$./c
area=28.274334
int main()
{ 
 Circle c ("white", 3);
 printf("area=%lfn", c.get_area());
 return 0;
}

你省略了 Circle.h, 和 shape.h 末尾的#endif 应该命名为 Shape.h.,但是你如何编译和链接代码。 可能是你没有把程序的所有部分?

原作者:
0 0

消息中缺少的vtable位表明 Shape.cpp 没有被链接。 由于你在编译源代码时使用了一个 IDE,因这里在编译源代码时可以能不会编译 -- 。

原作者:
...