ld:重复的符号

epo*_*olf 10 c++ xcode linker

我正在研究一个学校项目,我从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
Run Code Online (Sandbox Code Playgroud)

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

pax*_*blo 20

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

所以看起来你将io_functions.cpp文件包含在内,main.cpp并且generics.cpp在最好的时候这是一个坏主意.

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


Jos*_*ley 5

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

  • 仅在编译单元内 - 这里有两个独立的编译单元.ifndef会阻止你在main.cpp中包含两次文件. (10认同)
  • #ifndef 不能阻止这种情况发生吗? (3认同)