1

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

前提:我在 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”。这里唯一的区别是链接器搜索一个没有命名空间部分的损坏名称,我不知道为什么。

我试图更改方法的名称、位置、调用约定和签名,但无济于事,总是得到同样的错误。

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

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 构建此应用程序,并且它始终可以正常链接,除了这次与最后一次更改。

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

4

2 回答 2

1

该功能在哪里以及如何void addAccel(const Vec2 &a);实现?你确定你没有缺少Quark::函数实现的前缀吗?

于 2010-07-29T08:39:04.047 回答
0

嗯,我刚刚解决了这个问题。那里有两个错误的前向声明(在命名空间之外)夸克类和集群类。出于某种原因,g++ 对此表示满意,而 VC++ 对此抱怨是正确的。还是非常感谢。

于 2010-07-29T15:07:35.767 回答