ld:2个用于体系结构x86_64 clang的重复符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

时间:2015-06-20 02:53:48

标签: c++ macos linker

PEBKAC或MAC真是愚蠢。我有以下代码。

的main.cpp

#ifndef PARSER_H
#define PARSER_H

struct Parser
{
  Parser(const char* filename_);
  bool parse();

  private:
   const char* filename;
};

Parser::Parser(const char* filename_):filename(filename_){}

#endif

Parser.h

#include "Parser.h"

#include <iostream>

bool Parser::parse()
{
  std::cout<<"The file name is "<<filename<<std::endl;
  return false;
}

Parser.cpp

{{1}}

当我尝试使用命令

进行编译时,出现以下错误

g ++ Parser.cpp main.cpp

重复符号__ZN6ParserC2EPKc in:        /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/Parser-7ddc8e.o        /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/main-90a53f.o    重复符号__ZN6ParserC1EPKc in:        /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/Parser-7ddc8e.o        /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/main-90a53f.o     ld:架构x86_64的2个重复符号     clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

当我删除&#39; &#34; #include&#34; Parser.h&#34; &#39;从Parser.cpp,这个错误消失了(如果我这样做,我无法在Parser.cpp文件中定义任何函数)。是不是在保护避免重复符号的重点?不知道为什么它不能在MAC中工作? (我正在使用MAC控制台btw)。尝试了这么多线程,没有答案是明确的。对不起,如果它是重复的

1 个答案:

答案 0 :(得分:1)

MAC:1 Me:0

找到答案,不知道为什么我在Parser.h文件中定义类外的构造函数。我应该在类中或在.cpp文件外部定义它。这篇文章帮助我理解了我做错了什么。

http://samwho.co.uk/blog/2013/12/08/duplicate-symbol-what/

Parser.h

struct Parser     {       解析器(const char * filename_);       bool parse();

  private:
  const char* filename;
 };

Parser::Parser(const char* filename_):filename(filename_){} <-- This is the problem, has to be either defined inside the class or outside in .cpp.

这个固定的。 (应该更频繁地用C ++编写代码)。我想我不会删除该帖子,我觉得有人会需要它。无法为g ++找到很多资源。 (我认为在MAC中使用g ++的人并不多)

Parser.h

struct Parser
{
  Parser(const char* filename_): filename(filename_){}
  bool parse();

  private:
  const char* filename;
 };