1. ホーム
  2. c++

[解決済み] ld: シンボルが重複している

2022-02-15 21:38:54

質問

学校のプロジェクトで作業をしているのですが、Xcodeから変なエラーが出るんです。TextMateのCommand+R機能を使ってプロジェクトをコンパイルしています。コンパイルはうまくいっているようですが、リンクに失敗し、理解できないエラーメッセージが表示されます。

ldの出力です。

ld: シンボル text_field(std::basic_istream >&)in /path/final/build/final.build/Release/final.build/Objects-normal/ppc/generics.o and /path/final/build/final.build/Release/final.build/Objects-normal/ppc/main.o に重複して存在する。 collect2: ld は 1 の終了ステータスを返しました。

以下は、私のファイル io_functions.cpp です。プロジェクト全体で text_field の宣言はこれだけです。

#include <string>
#include <iostream>
#include <iomanip>

using namespace std;

#ifndef ENDF
#define ENDF '|'
#define ENDR '\n'

/**
reads one field from a given input stream
Usage: var = text_field(in)
*/
string text_field(istream &in){
    string s;
    getline(in, s, ENDF);
    return s; 
}

long long_field(istream &in){
    return atol(text_field(in).c_str()); 
}

int int_field(istream &in){
    return atoi(text_field(in).c_str()); 
}

double double_field(istream &in){
    return atof(text_field(in).c_str()); 
}

#endif

何が問題なのか?いろいろな理由から、私は自分のプロジェクトのソース全体を掲載したくありません。

解決方法は?

最初に思ったのは、リンカーコマンドで2回インクルードしていることですが、同じ関数があることに文句を言っているように見えます。 main.ogenerics.o .

を含めているように見えるわけです。 io_functions.cpp ファイルを main.cppgenerics.cpp というのは、最高にまずい。

ヘッダーファイル(例. io_functions.h に含まれるすべてのものを指定します。 io_functions.cpp を含むこと。 ヘッダー ファイルを他の2つのファイルに追加します。