ld: 重复符号

16

我正在做一项学校项目,但在Xcode中遇到了一些奇怪的错误。我使用TextMate的Command+R功能编译项目。编译似乎正常工作,但链接失败并显示一个我不理解的错误信息。

ld输出:

ld: duplicate symbol 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 returned 1 exit status

以下是我的file 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个回答

22
我的第一反应是你在链接命令中重复包含它,但似乎在 main.ogenerics.o 中使用了相同的函数而出现问题。
因此,你似乎将 io_functions.cpp 文件包含到了 main.cppgenerics.cpp 中,这通常是一个不好的想法。
你应该有一个头文件(例如,io_functions.h),其中指定了 io_functions.cpp 中包含的所有内容,并将该头文件包含到另外两个文件中。

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

3
#ifndef 难道不能防止这种情况发生吗? - epochwolf
13
只有在编译单元内——这里你有两个独立的编译单元。#ifndef 指令可以防止在 main.cpp 中重复包含该文件。 - paxdiablo

0
使用 "inline" 关键字修饰重复的方法。
inline string text_field(istream &in)

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

详情请参见文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接