PEBKAC或MAC真是愚蠢。我有以下代码。
#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;
}
{{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)。尝试了这么多线程,没有答案是明确的。对不起,如果它是重复的
答案 0 :(得分:1)
MAC:1 Me:0
找到答案,不知道为什么我在Parser.h文件中定义类外的构造函数。我应该在类中或在.cpp文件外部定义它。这篇文章帮助我理解了我做错了什么。
http://samwho.co.uk/blog/2013/12/08/duplicate-symbol-what/
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 ++的人并不多)
struct Parser
{
Parser(const char* filename_): filename(filename_){}
bool parse();
private:
const char* filename;
};