ld:重复的符号

时间:2008-11-12 01:17:54

标签: c++ xcode linker

我正在研究一个学校项目,我从Xcode那里得到了一些奇怪的错误。我正在使用TextMate的Command + R函数来编译项目。编译似乎工作正常但链接失败与我不明白的错误消息。

ld输出:

  

ld:/path/final/build/final.build/Release/final.build/Objects-normal/ppc/generics.o和/ path / final中的重复符号text_field(std :: basic_istream>&) /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

出了什么问题?出于多种原因,我不想发布我的项目的整个来源。

3 个答案:

答案 0 :(得分:18)

我的第一个想法是你在链接器命令中包含了两次,但它似乎在抱怨在main.ogenerics.o中使用相同的功能。

所以看起来您将io_functions.cpp文件包含在main.cppgenerics.cpp中,这在最好的时候是个坏主意。

您应该有一个标题文件(例如io_functions.h),它指定io_functions.cpp中包含的所有内容,并将标题文件包含在其他两个文件中。

答案 1 :(得分:5)

听起来io_functions.cpp被包含两次(一次是generics.cpp,一次是main.cpp)。

答案 2 :(得分:0)

使用“内联”关键字修饰重复方法

inline string text_field(istream &in)

内联函数是实际的函数,其函数主体的副本直接注入到调用函数的每个位置。

有关详细信息,请参见article