14

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

ld输出:

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

出了什么问题?出于多种原因,我不想发布我的项目的全部源代码。

4

3 回答 3

22

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

所以看起来你正在将io_functions.cpp文件包含在其中main.cppgenerics.cpp这在最好的情况下是个坏主意。

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

于 2008-11-12T01:26:54.633 回答
5

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

于 2008-11-12T01:22:59.943 回答
1

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

inline string text_field(istream &in)

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

详情请看文章

于 2020-01-23T07:50:52.053 回答