2010-03-24 120 views
4

我正在使用Google測試框架設置一些單元測試。我在我的解決方案有三個項目:在同一解決方案上交叉處理不同項目時,Visual Studio 2008上的C++鏈接問題

  • FN(我的項目)
  • FN_test(我的測試)
  • GTEST(谷歌測試框架)

我設置FN_test有FN和gtest作爲引用(依賴關係),然後我想我已經準備好設置我的測試了(我已經將所有人設置爲/ MTd(不這樣做會導致我之前將錯誤鏈接))。

特別是,我在FN中定義了一個名爲Embark的類,我想使用FN_test進行測試。到現在爲止還挺好。因此,我寫稱爲CLASSE使用EmbarkTest googletest,聲明一個成員踏上*和構造函數裏面寫:

EmbarkTest() { 
    e = new Embark(900,2010); 
} 

然後,F7按下時,我得到如下:

1>FN_test.obj : error LNK2019: unresolved external symbol "public: __thiscall Embark::Embark(int,int)" ([email protected]@[email protected]@Z) referenced in function "protected: __thiscall EmbarkTest::EmbarkTest(void)" ([email protected]@[email protected]) 1>D:\Users\lg\Product\code\FN\Debug\FN_test.exe : fatal error LNK1120: 1 unresolved externals

不有人知道我做錯了什麼和/或我能做些什麼來解決這個問題?

編輯:從Embark.h

class Embark 
{ 
public: 

    //Constructor for initial state 
    Embark(int _id, int _year); 
    //Destructor 
    ~Embark(); 
/* ... */ 
} 
+0

Embark.cpp的相應代碼怎麼樣? – 2010-03-24 15:44:16

+0

在嘗試鏈接微軟內部C++單元測試框架時,我遇到了與Visual Studio 2013非常類似的問題。經過一些嘗試這個問題/答案幫助了我。此外,說明明顯的單元測試在動態語言中不起作用。如果您在Python中調用未定義的函數,則單元測試失敗。如果您在C++中調用未定義的函數,那麼該項目將不會鏈接,並且根本沒有運行測試。在C++中需要採用稍微不同的TDD方法。 – 2014-05-03 15:56:17

回答

3

我發現答案是一個相當簡單的答案。經過緊張激烈的headknocking兩天,那就是:

你必須編譯你的主要項目爲.lib而不是.exe

這樣做了以後,所有的鏈接去的幸福。我認爲Visual Studio會爲我自動執行此操作,因爲我從FN_test聲明瞭對FN的依賴關係:我假定Visual Studio會創建這些庫。它沒有。


RANT(無需在此之後讀取)
因爲它是相當罕見的鏈接一個項目,使一個可執行到另一個該做同樣的事情,在這種發現引用的問題是有些硬。谷歌搜索給我沒有有用的結果。 MSDN論壇也無濟於事。

但是,當你在一個應用程序上進行單元測試時,在同一個解決方案中發生這種情況,比如說一個測試項目和一個應用程序項目會很常見嗎?我對C++的其他測試框架不瞭解。我選擇了谷歌測試框架爲:

  1. 在谷歌,我們相信
  2. 大文件
  3. 非常簡單的使用和理解

但是,但是,對整合沒有太多可取之處。我認爲其他工具可以更好地整合到Visual Studio,包括IDE響應。但我寧願現在受到的傷害比之後更大。我希望這個工具不斷改進,因爲我喜歡它。

+1

我這樣做沒有單獨的測試項目。庫項目包含自己的測試代碼,它被排除在除了測試一個,測試配置生成一個.exe而不是一個.lib – 2010-03-25 14:14:55

+0

這是一個很好的方法,但我有兩個exes,不是一個庫和一個exe,但創建稱爲Test的配置的想法很好。更改爲測試並運行,它將運行測試,而不是應用程序。 – 2010-03-25 17:41:42

1

鏈接器相關代碼找不到Embark構造函數的定義。

  • 你是否在某處定義了構造函數?
  • 您的測試項目是否實際鏈接到FN庫?
+0

1)是的,它在Embark類(FN)中定義。 2)我期望它鏈接到FN庫,因爲我已經將它設置爲對FN_test的引用(依賴)(我對gtest做了同樣的處理,並且我沒有在那裏鏈接問題)。 – 2010-03-24 12:40:29

+0

你能從包含Embark類的頭文件和源文件中發佈相關代碼嗎? – 2010-03-24 12:45:47

+0

也依賴不總是鏈接 - 你有'配置屬性 - >鏈接器 - >鏈接庫依賴關係'打開? – 2010-03-24 15:43:35

1

鏈接器無法找到Embark::Embark(int, int)

下面是MSDN說,有關錯誤LNK2019

+0

我想知道爲什麼連接器找不到它。 – 2010-03-24 12:56:07

+0

這很可能是您的項目設置。您能告訴我們您正在做什麼嗎? – xian 2010-03-24 13:04:39

+0

項目 - >項目依賴項 - > FN_test - >檢查FN和gtest,OK。 – 2010-03-24 17:18:59