神经网络实现的C ++错误:架构x86_64的重复符号

时间:2016-10-02 01:21:27

标签: c++ xcode eclipse linker

嘿伙计们我正在尝试用C ++实现反向传播算法,我尝试过Xcode和C ++ Eclipse,但是我遇到了同样的错误而且我不知道如何修复它,我试过在这里搜索但是没有提出的解决方案,这是以下错误消息和我的代码。

错误讯息:

make all 
Building file: ../src/NeuralNet.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/NeuralNet.d" -MT"src/NeuralNet.d" -o"src/NeuralNet.o" "../src/NeuralNet.cpp"
Finished building: ../src/NeuralNet.cpp

Building target: NeuralNet
Invoking: MacOS X C++ Linker
g++  -o "NeuralNet"  ./src/Net.o ./src/NeuralNet.o   
duplicate symbol __ZN3NetC2ERKNSt3__16vectorIjNS0_9allocatorIjEEEE in:
    ./src/Net.o
    ./src/NeuralNet.o
duplicate symbol __ZN3NetC1ERKNSt3__16vectorIjNS0_9allocatorIjEEEE in:
    ./src/Net.o
    ./src/NeuralNet.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [NeuralNet] Error 1

这是我的代码:

NeuralNet.cpp

#include <iostream>
#include <vector>
#include "Net.cpp"

using namespace std;

int main() {
    vector<unsigned> topology;
    topology.push_back(10);
    Net net(topology);


    return 0;
}

Net.h

#ifndef NET_H_
#define NET_H_

#include <vector>

using namespace std;

class Net {
public:
    Net(const vector<unsigned>& topology);
};

#endif

Net.cpp

#include "Net.h"

Net::Net(const vector<unsigned>& topology) {
    // TODO Auto-generated constructor stub

}

1 个答案:

答案 0 :(得分:0)

您的IDE正在尝试将两个.cpp文件编译为单独的编译单元,因为通常这些文件包含单独的编译单元。

但是您在Net.cpp中包含NeuralNet.cpp,因此其中的代码(即Net::Net的实现)是以Net.cpp为单位编译的,以及单位NeuralNet.cpp

编译两个编译单元后,调用链接器将它们链接在一起。它注意到Net::Net出现两次并且不知道选择哪个,因此错误。

您永远不应该#include .cpp个文件。将#include "Net.cpp"替换为#include "Net.h"。您始终包含类的标头(.h),而不是源(.cpp)。