【问题标题】:Header Multiple Redefinition标题多重重定义
【发布时间】:2015-05-20 18:27:19
【问题描述】:

我知道这个问题已经被问死了,但我已经做了相当多的研究,到目前为止没有任何帮助。是的,我有很多头守卫 不,据我所知,没有什么需要内联每个函数都在一个类中。我有一个encoderrunner.cpp,其中包含encoder.h 和decoder.h,encoder.h 和decoder.h 都包含FrequencyTable.h,这就是所有地狱都崩溃的地方,编译器说FrequencyTable 中的所有内容都是重新定义。这是其中之一,这恰好来自我从 FrequencyTable 中分离出来的类

/home/sersay/Documents/ECS60/p4/FrequencyNode.cpp:10: multiple definition of `FrequencyNode::FrequencyNode(unsigned char, FrequencyNode*, FrequencyNode*)'
decoder.o:/home/sersay/Documents/ECS60/p4/FrequencyNode.cpp:10: first defined here

等等……

  • 我已经/添加了标题保护,包括尝试 #pragma 一次
  • FrequencyTable 本来是一个嵌套类,所以我试着把它分成两个类,还是一样的错误
  • 我确实有类之外的函数,但它们不存在于我的 FrequencyTable 类或我与之分离的其他类中

我可以提供更多代码,但我不相信它完全相关,也许这就是我编译它的方式?

encoder.out : decoder.o encoder.o encoderRunner.o  
g++ -ansi -Wall -g -o encoder.out decoder.o encoder.o encoderRunner.o  

decoder.o : decoder.cpp decoder.h 
g++ -ansi -Wall -g -c decoder.cpp

encoder.o : encoder.cpp encoder.h 
g++ -ansi -Wall -g -c encoder.cpp

encoderRunner.o : encoderRunner.cpp CPUTimer.h encoder.h decoder.h 
g++ -ansi -Wall -g -c encoderRunner.cpp

clean : 
rm -f encoder.out decoder.o  encoder.o  encoderRunner.o  

编辑1:

    #pragma once
    #ifndef FrequencyTable_H_
    #define FrequencyTable_H_

    #include "FrequencyNode.h"

    //class FrequencyNode;

    class FrequencyTable
    {
    private:
        FrequencyNode *HighestNode;
        FrequencyNode *LowestNode;
    public:
        FrequencyTable();
        ~FrequencyTable();
        FrequencyNode * insert(unsigned char symbol); //USE THIS for new values in hash
        unsigned char * GetOrder();

    };


//#include "FrequencyTable.cpp"
#endif

Edit2(Ed 的请求):

#include "FrequencyTable.h"
#include "FrequencyNode.h"
#include <iostream>
#include <stdlib.h>
using namespace std;

请告诉我您还需要什么其他信息

【问题讨论】:

  • 你能创建一个 SSCCE 来展示这种行为吗?
  • 这不是您的真实代码,因为您甚至从未构建 FrequencyNode.cpp。还是您将其包含在标题中?不要。
  • 您的文件之一似乎是#include-ing FrequencyNode.cpp。你绝对不想那样。
  • 我没有创建 makefile,它是我的教授用来制作项目的文件,我假设 makefile 将在他概述的编码器和解码器中创建我的类
  • @Sersay //#include "FrequencyTable.cpp" 如果那是有问题的代码,则应改为扩展 makefile,以编译和链接 FrequencyTable.cpp

标签: c++ compiler-errors


【解决方案1】:

我感觉到它与编译有关,但感谢 @Lightness Races in Orbit 和 @πάντα ῥεῖ 我将我的 makefile 重写为

encoder.out : FrequencyNode.o FrequencyTable.o decoder.o encoder.o encoderRunner.o  
    g++ -ansi -Wall -g -o encoder.out FrequencyTable.o FrequencyNode.o decoder.o encoder.o encoderRunner.o  

FrequencyNode.o : FrequencyNode.cpp FrequencyTable.h
    g++ -ansi -Wall -g -c FrequencyNode.cpp

FrequencyTable.o : FrequencyTable.cpp FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c FrequencyTable.cpp

decoder.o : decoder.cpp decoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c decoder.cpp

encoder.o : encoder.cpp encoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c encoder.cpp

encoderRunner.o : encoderRunner.cpp CPUTimer.h encoder.h decoder.h FrequencyTable.h FrequencyNode.h
    g++ -ansi -Wall -g -c encoderRunner.cpp

clean : 
rm -f encoder.out FrequencyTable.o FrequencyNode.o decoder.o encoder.o encoderRunner.o

话虽如此,我知道您不必专门编译 iostream 和 stdlib.h 之类的东西?这是因为他们使用内联还是模板,任何人都可以将我链接到可以解释这一点或自己解释的东西吗?

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多