2010-07-29 84 views
1

请帮助我,我有一个奇怪的问题,我无法以任何方式解决。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 @夸克@@ QAEXABV?$ @ TemplateVec2米@ Atlax @@@ Z”

而在的.lib文件有链接器搜索(我发现使用DUMPBIN)“ ?addAccel @夸克@硫@@ QAEXABV?$ @ TemplateVec2米@ 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 @集群@硫@@ QAEPAVQuark @@ W4Feature @ 2 @ MMMM @ Z”

,但在图书馆有“?addQuark @集群@硫@@ QAEPAVQuark @ 2 @ W4Feature @ 2 @ MMMM @ Z”。

这次的区别在于编译器搜索的版本中'@'之间缺少第一个'2'。

这不是我第一次用Visual Studio创建这个应用程序,除了这次与上次更改之外,它总是链接正常。

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

+0

如果通过undname运行最后两个。你会看到它实际上是同样的错误 - 一个是'类Quark'上的方法,另一个是'class sulfur :: Quark'。 – Rup 2010-07-29 08:32:22

+0

是的,但我无法想象为什么链接器正在搜索类Quark之外的命名空间,因为它甚至不存在。 – Mitridas 2010-07-29 09:06:54

回答

1

在哪里,怎么会是void addAccel(const Vec2 &a);功能实现的?你确定你没有丢失Quark::前缀对函数的执行吗?

+0

addAccel实现像类中的所有其他方法一样位于Quark.cpp文件中,并且类似于以下实现: void sulb:Quark :: addAccel(const Vec2&a) {0} = + = mass * a; cluster-> wakeUp(); } 我从这样的应用程序调用它: Vec2 power(...); state.selQ-> addAccel(power); 其中state.selQ是Quark *类型。 – Mitridas 2010-07-29 08:47:00

0

嗯,我刚刚解决了这个问题。 有夸克类和类集群有两个错误的前向声明(命名空间之外)。出于某种原因,g ++可以,因为VC++对此抱怨是正确的。 反正谢谢你。