在cpp文件中定义的方法时未解析的外部,但在头部中没有

时间:2012-04-12 00:37:52

标签: c++ linker c++11 visual-c++-2010 unresolved-external

更新2 :找到导致此

的前向声明错误

更新使用Visual Studio 2010 stock编译器编译,启用c ++ 0x。

我有一个带有成员函数的类,它表现得很奇怪。

当我在cpp文件中定义方法时,链接器会出现“未解析的外部符号”错误。当我将定义移动到标题时,它编译得很好。

1)这不是模板化的方法 2)肯定正在编译cpp文件 3)我很难过

有什么想法吗?

头文件

// THIS IS THE ERROR HERE: I forward declare TPA as a class, when it is actually a struct
class TollingPathAttributes; // forward declare the TollingPathAttributes struct as a class (doh!)

class TollingPathAttributesOutput
{
public:
    TollingPathAttributesOutput(HighwayCommand* command);
    ~TollingPathAttributesOutput();

    void foo();
    void AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes);

protected:
    string                                      m_outputFilename;
    vector<shared_ptr<TollingPathAttributes>>   m_data;
    queuing_mutex                               m_dataMutex;
};

cpp文件

void TollingPathAttributesOutput::foo() {}

void TollingPathAttributesOutput::AddPathAttributes(boost::shared_ptr<TollingPathAttributes> attributes)
{
    queuing_mutex::scoped_lock lock(m_dataMutex);
    m_data.push_back(attributes);
}

调用电话

m_output->foo();  // compiles and links no problem
boost::shared_ptr<TollingPathAttributes> attr = 
    boost::make_shared<TollingPathAttributes>(origin, dest, UNTOLLED_OPTION, vector<int>(), 0.0, 0.0);
m_output->AddPathAttributes(attr); // compiles fine, but only links correctly if I move the definition to the header

链接错误

1>OtCustomZenith_logic.lib(TollingPathAttributesRecorder.obj) : error LNK2019: unresolved external symbol "public: void __thiscall TollingPathAttributesOutput::AddPathAttributes(class boost::shared_ptr<class TollingPathAttributes>)" (?AddPathAttributes@TollingPathAttributesOutput@@QAEXV?$shared_ptr@VTollingPathAttributes@@@boost@@@Z) referenced in function "public: virtual void __thiscall TollingPathAttributesRecorder::Record(class TolledPath &,class boost::shared_ptr<class Path>,int)" (?Record@TollingPathAttributesRecorder@@UAEXAAVTolledPath@@V?$shared_ptr@VPath@@@boost@@H@Z)     
1>..\..\..\OT\OtCustomZenith_test.exe : fatal error LNK1120: 1 unresolved externals

2 个答案:

答案 0 :(得分:3)

感谢每一位试图提供帮助的人 - 不幸的是,这个错误大约在键盘后方1英尺处。这里的问题归结为使用前向声明来加快编译时间。因为我 错误地 转发将TollingPathAttributes的类型声明为类而不是结构。

这意味着标头的定义与cpp中的定义略有不同,因为我实际上在cpp文件中包含了TollingPathAttributes的完整定义。混淆这个问题的一件大事是,我收到的错误消息并不是我期望收到的 - 正如@MarkRansom所说,通常如果cpp和header之间存在不匹配,那将是编译错误而不是链接错误所以我必须得出结论:

1)编译器只是推动了不正确的'class'(而不是'struct')定义,即使它有一个完整的定义可用就知道了。导致一个lib文件,其签名几乎不是链接器所寻找的。

2)其他一些奇怪

答案 1 :(得分:0)

根据错误消息判断您的.cpp文件正在编译为.lib。是否有可能存在.lib的两个副本,一个正在使用每个编译进行更新,另一个正在链接到.exe?