与Visual C ++ 2005奇怪的链接问题

时间:2010-07-29 08:04:50

标签: c++ visual-c++ visual-c++-2005

请帮助我,我有一个奇怪的问题,我无法以任何方式解决。

前提:我在Windows 7 x64上使用visual c ++ 2005,我确信我的代码没有致命的缺陷,因为在Linux下使用g ++可以很好地运行。

我正在开发一个使用我也开发的静态库的应用程序。

在应用程序的链接阶段,我得到两个神秘的LNK2019错误。

这是该库的一个类的标题:

namespace sulfur
{
class Quark
{
public:
... various methods
void addAccel(const Vec2 &a);
... various methods
private:
... various data
};
}

显然,在cpp文件中,我为addAccel提供了一个具有完全相同签名的实现。

当我尝试将应用程序与库链接时,找到了除addAccel之外的所有其他成员函数。

链接器搜索符号“?addAccel @ Quark @@ QAEXABV?$ TemplateVec2 @ M @ Atlax @@@ Z”

在.lib文件中(我发现使用dumpbin)“?addAccel @ Quark @ sulfur @@ QAEXABV?$ TemplateVec2 @ M @ Atlax @@@ Z”。这里唯一的区别是链接器搜索没有命名空间部分的错位名称,我不知道为什么。

我试图更改名称,位置,调用约定和metod的签名但无效,总是得到相同的错误。

第二个错误非常相似。我在库中有另一个标题:

namespace sulfur
{
class Cluster
{
...
Quark *addQuark(sulfur::Feature feat, float x, float y, float m=0.1f, float aF=0.01f);
...
};
}

并提供了正确的实现文件。像以前一样,所有其他方法都正确链接,但不是addQuark。

链接器搜索“?addQuark @ Cluster @ sulfur @@ QAEPAVQuark @@ W4Feature @ 2 @ MMMM @ Z”

但是在图书馆里有“?addQuark @ Cluster @ sulfur @@ QAEPAVQuark @ 2 @ W4Feature @ 2 @ MMMM @ Z”。

这次差异是编译器搜索的版本中'@'之间没有第一个'2'。

这不是我第一次使用visual studio构建这个应用程序,它总是链接正常,除了这次与最后的更改。

我没有任何线索, 提前谢谢你

2 个答案:

答案 0 :(得分:1)

void addAccel(const Vec2 &a);功能在何处以及如何实施?你确定在函数的实现上没有遗漏Quark::前缀吗?

答案 1 :(得分:0)

好吧,我刚刚解决了这个问题。 类Quark和类Cluster的两个错误的前向声明(名称空间之外)。出于某种原因,g ++对此有好处,而VC ++对此抱怨是正确的。 无论如何,谢谢你。