请帮助我,我有一个奇怪的问题,我无法以任何方式解决。
前提:我在 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 构建此应用程序,并且它始终可以正常链接,除了这次与最后一次更改。
我没有任何线索,提前谢谢你