请帮助我,我有一个奇怪的问题,我无法以任何方式解决。
前提:我在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构建这个应用程序,它总是链接正常,除了这次与最后的更改。
我没有任何线索, 提前谢谢你
答案 0 :(得分:1)
void addAccel(const Vec2 &a);
功能在何处以及如何实施?你确定在函数的实现上没有遗漏Quark::
前缀吗?
答案 1 :(得分:0)
好吧,我刚刚解决了这个问题。 类Quark和类Cluster的两个错误的前向声明(名称空间之外)。出于某种原因,g ++对此有好处,而VC ++对此抱怨是正确的。 无论如何,谢谢你。