2010-07-29 108 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++對此抱怨是正確的。 反正謝謝你。