【问题标题】:ld: 2 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)ld:架构 x86_64 的 2 个重复符号 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
【发布时间】:2015-06-20 02:53:48
【问题描述】:

PEBKAC 或 MAC 真的很笨。我有以下代码。

main.cpp

#include <iostream>

#include "Parser.h"

using namespace std;

const char *filename = "main.c";

int main()
{
    cout<<"Parser"<<endl;

    Parser *p = new Parser(filename);
    p->parse();

   return 0;
 }

解析器.h


#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

解析器.cpp

#include "Parser.h"

#include <iostream>

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

当我尝试使用命令编译时出现以下错误

g++ Parser.cpp main.cpp

重复符号 __ZN6ParserC2EPKc 在: /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/Parser-7ddc8e.o /var/folders/sh/3w74dm6n05jbtbv6hzx9f3_00000gn/T/main-90a53f.o 重复符号 __ZN6ParserC1EPKc 在: /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 查看调用)

当我从 Parser.cpp 中删除 ' "#include "Parser.h" ' 时,此错误会消失(如果我这样做,我无法在 Parser.cpp 文件中定义任何函数)。不是保护整个点避免重复符号?不知道为什么它不能在 MAC 中工作?(我正在使用 MAC 控制台顺便说一句)。尝试了这么多线程,没有明确的答案。抱歉,如果它是重复的

【问题讨论】:

    标签: c++ macos linker


    【解决方案1】:

    MAC:1 我:0

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

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

    解析器.h

    结构解析器 { 解析器(const char* 文件名_); 布尔解析();

      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++ 的人并不多)

    解析器.h

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2023-04-11
      相关资源
      最近更新 更多