未定义的类方法引用

时间:2013-11-30 18:17:06

标签: c++ algorithm oop

我有一个类,Pose.hpp和Pose.cpp,以及一个main.cpp来使用它,但是在编译时我遇到了错误。 我正在使用它来编译:

$g++ -c main.cpp
$g++ -c Pose.cpp
$g++ -o Pose.o main.o



// Pose.hpp

#include "Vec3f.hh"
#include <vector>

using namespace std;
using std::vector;
class Pose
{
    Vec3f root_position;
    vector < Vec3f > bonesAngles;
    vector < Vec3f > bonesPosition;

    public:

    void setRootPosition (Vec3f position);
    void addBone (Vec3f newBone);
};

//Pose.cpp

#include "Pose.hpp"

using namespace std;

void Pose :: setRootPosition (Vec3f position)
{
    root_position = position;
}

void Pose :: addBone (Vec3f newBone)
{
    bonesAngles.push_back(newBone);
}

//main.cpp

#include <iostream>
#include "Pose.hpp"

using namespace std;

int main()
{
    Pose pose;
    Vec3f aux(.2,.3,.4);
    pose.addBone(aux);
    return 0;
}

我收到了错误: /tmp/ccSzsctS.o:main.cpp:function main:错误:未定义引用'Pose :: addBone(Vec3f)'

collect2:erro:ld返回1退出状态

1 个答案:

答案 0 :(得分:0)

您必须为每个.cpp编译.o文件。试试这个:

  

$ g ++ -c Pose.cpp -o Pose.o

     

$ g ++ -c main.cpp -o main.o

     

$ g ++ -o Pose.o main.o MyProgram

.o文件被称为“对象”文件,基本上将包含最终编译的所有信息。在您的情况下,您需要函数定义(这是您的编译错误所说的)。正如您所做的那样进行编译只会检查语法是否正确。

编译期间有两个步骤:编译和链接。编译(使用您的命令行)只是检查语法是否正确。在此步骤结束时,将生成目标文件。链接使用目标文件(以及可能的其他类型的文件,如.dll,.lib)来创建最终产品(在您的情况下是一个可执行文件,但您可以生成许多不同的东西,如.dll,.lib, .a等...)。

理解编译是编程中的关键步骤,我邀请您进入编程。

有关更详细的说明,请查看:http://www.cs.fsu.edu/~jestes/howto/g++compiling.txt

祝你好运!