【问题标题】:Undefined Symbols?未定义的符号?
【发布时间】:2012-11-07 17:20:47
【问题描述】:

我现在有两个继承的类,一个是基类,包含多态性,它是接口:

#include <vector>
#ifndef _Signal_h
#define _Signal_h
using namespace std;

typedef vector<double> DIMENTIONS_2;

class Signal {

public:

    Signal();
    Signal(const int N, const int M)
    {
        this->width = N;
        this->height = M;
    };

    virtual vector<DIMENTIONS_2> splitSignal(vector<double> &theData) const = 0;
    virtual vector<DIMENTIONS_2> filterSignal(vector<DIMENTIONS_2>&blocks) const = 0;
    virtual vector<double> returnRawSignal() const = 0;

    virtual int zerocross() const = 0;
    virtual double energy() const = 0;
    virtual int zerocrossmap() = 0;
    virtual bool readSignal() const = 0;

protected:

    vector<double> rawSignal;
    int width;
    int height;
};

#endif

以及继承和实现的类之一:

#include "Signal.h"

#ifndef _Audio_h
#define _Audio_h

typedef vector<double> DIMENTIONS_2;

class Audio : public Signal {

  public:

     Audio();
     Audio(const int N, const int M);

     vector<DIMENTIONS_2> splitSignal(vector<double>&data, int N, int M);
     vector<DIMENTIONS_2> filter(vector<DIMENTIONS_2> &data, double sumthres, double zerothres);

     double energy(vector<double> &blocks);

     int zerocross(vector<double> &block);

     int zerocrossmap(vector<double> &strippedData);

     template<typename T>
     int sign(T n);
 };


 #endif

Audio 类具有实现 (.cpp) 但每当我尝试使用它进行编译时:

g++ Signal.h Audio.h Audio.cpp main.cpp 

我收到以下错误:

架构 x86_64 的未定义符号: “Signal::Signal()”,引用自: ccdjMubM.o 中的 Audio::Audio() ccdjMubM.o 中的 Audio::Audio() ld:未找到架构 x86_64 的符号 collect2: ld 返回 1 个退出状态

有什么想法吗?

【问题讨论】:

  • 或者你可以在类中内联实现它。
  • 停止将; 放在函数定义的末尾! :) 编译器甚至可以在严格模式下给你一个警告。
  • 其他人都没有提到过,它的拼写是“dimension”,除非有我找不到的区域拼写。
  • @Phorce:正确。但这是一个声明,我说的是“double foo() {};”中的定义,在这种情况下不需要;。
  • @phasetwenty:这是福尔斯方言,你是纳粹语法! :)

标签: c++ compiler-errors g++ linker-errors undefined-reference


【解决方案1】:

构造函数Signal() 没有实现。刚刚添加了它,它应该可以解决您的问题。

【讨论】:

    【解决方案2】:

    链接器缺少Signal 类的默认构造函数的定义(主体)。

    【讨论】:

      【解决方案3】:

      源文件是用来编译的,而头文件是用来包含的。

      所以,编译命令应该是:

      g++ Audio.cpp main.cpp

      另外,还需要为Signal类的默认构造器提供一个实现,可以这么简单

      信号(){};

      在 Signal.h 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 2019-05-13
        • 2020-01-27
        • 2012-12-21
        • 2012-05-29
        • 1970-01-01
        相关资源
        最近更新 更多