【问题标题】:ld: duplicate symbolld:重复符号
【发布时间】:2008-11-12 01:17:53
【问题描述】:

我正在做一个学校项目,我从 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 和 /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

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

【问题讨论】:

    标签: c++ xcode linker


    【解决方案1】:

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

    所以看起来您将io_functions.cpp 文件包含在main.cpp 和generics.cpp 中,这在最好的情况下是个坏主意。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • #ifndef 不会阻止这种情况的发生吗?
      • 仅在编译单元内 - 这里有两个独立的编译单元。 ifndef 会阻止您在 main.cpp 中包含该文件两次。
      【解决方案3】:

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

      inline string text_field(istream &in)
      

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

      详情请见article

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多