为什么我的c ++代码会一直返回'未定义的引用'我尝试编译时的一个构造函数?

时间:2017-03-25 18:52:36

标签: c++

我一直试图让我的代码编译一段时间。保持在线寻找我的问题的解决方案,但我没有找到一个。一些帮助将不胜感激。

以下是我的一些文件:

gate.h

#ifndef GATE_H
#define GATE_H

#include <vector>

class Gate {
private:
  std::vector<int> inWires, outWires;
  char function;
public:
  Gate (char function, const std::vector<int>& inputWires, const std::vector<int>& outputWires);
};

#endif

gate.cpp

#include "gate.h"

Gate::Gate (char functionality, const std::vector<int>& inputWires, const std::vector<int>& outputWires) {
  function = functionality;
  inWires = inputWires;
  outWires = outputWires;
}

circuit_file_reader.h

#ifndef CIRCUIT_FILE_READER_H
#define CIRCUIT_FILE_READER_H

#include <string>
#include <iostream>
#include <vector>
#include "circuit.h"
#include "gate.h"

Circuit readCircuit(std::string filename);

#endif

circuit_file_reader.cpp

#include "circuit_file_reader.h"

Circuit readCircuit (std::string filename) {
  std::vector<int> iw (1, 7);
  std::vector<int> ow (1, 8);
  Gate g0 ('a', iw, ow); // This is the problem
  std::vector<Gate> gates;
  // gates.push_back (g0);
  return Circuit (gates, 0);
}

test_circuit_file_reader.cpp

#include <iostream>
#include <string>
#include "circuit_file_reader.h"

int main(int argc, char** argv) {
  readCircuit("");
  std::cout << "Test Worked!" << std::endl;
  return 0;
}

每当我尝试编译此代码时,我的编译器都会返回

circuit_file_reader.cpp:(.text+0xa5): undefined reference to `Gate::Gate(char, std::vector<int, std::allocator<int> > const&, std::vector<int, std::allocator<int> > const&)'                                                       collect2: error: ld returned 1 exit status 

这很奇怪,因为已经定义了Gate构造函数,所以它为什么不能看到它?

2 个答案:

答案 0 :(得分:1)

您在头文件中声明了标头,但其定义位于源(.cpp)文件中。您没有将此指定给编译器。您没有指定要编译的内容,但如果您正确编译所有源文件,那么它应该可以工作。以下是使用g ++的示例。

你没有提供所需的circuit.h文件来编译程序,所以我做了一个虚拟的文件就可以编译了。

编辑:我被要求删除图片,所以这里是文本中的g ++命令。

g++ circuit_filer_reader.cpp gate.cpp main.cpp -o test
./test
Test Worked!

如果无论出于何种原因,任何人想要编译它都是虚拟的circuit.h文件。

#include "gate.h"
struct Circuit
{
    Circuit(std::vector<Gate> gates, int test)
        {
            return;
        }
};

答案 1 :(得分:1)

您没有提供编译器命令,但我猜您在尝试生成最终二进制文件时没有链接gate.o。