2012-04-12 106 views
3

簡短的問題是:如何使用Visual Studio創建/編譯/運行在不同目錄中具有源代碼的項目。包含來自其他目錄的標題時的Visual Studio鏈接錯誤

下面是具體的細節:

我有一個目錄中的類定義文件(.HPP)和實現文件(的.cpp),我有別的目錄下的main.cpp文件。在Visual Studio 2008中,我創建了一個新項目並將main.cpp放入該項目中。我將類文件目錄添加到其他包含目錄(右鍵單擊項目 - >項目屬性 - >配置屬性 - C/C++ - 常規 - >其他包含目錄= C:\ Test \ cpp)。

當我這樣做時,intellisense在編輯main.cpp時工作正常。當我生成項目,它編譯罰款,但我得到的鏈接錯誤,如:

錯誤LNK2019:無法解析的外部符號「公用:整數__thiscall測試::添加(INT)」(添加測試@ @@? QAEHH @ Z)在函數_main中引用。

據我所知,Visual Studio實際上並沒有編譯Test.cpp(我沒有看到它的任何.obj文件)。在編譯/構建main.cpp之前,我已經嘗試編譯它,但這並沒有什麼區別。有沒有解決的辦法?當我在網上搜索答案時,我發現很多人忘記爲鏈接器添加庫,但我沒有處理任何庫。

我也通過將Test.hpp和Test.cpp移動到與main.cpp相同的目錄來驗證此代碼編譯和運行正常 - 工作沒有任何問題。我只會堅持使用該設置,但我需要能夠使用來自不同目錄的源代碼來處理我正在處理的項目。

這裏有3個文件:

  1. C:\測試\ CPP \ Test.hpp

    #ifndef TEST_H 
    #define TEST_H 
    
    class Test 
    { 
    private: 
        int mynum; 
    
    public: 
        Test(); 
        int add(int num); 
    
    }; 
    #endif //TEST_H 
    
  2. C:\測試\ CPP \ Test.cpp的

    #include "Test.hpp" 
    
    Test::Test() 
    { 
        mynum = 0; 
    } 
    
    int Test::add(int num) 
    { 
        return mynum += num; 
    } 
    
  3. C:\ Visual Studio Projects \ MyProject \ main.cpp

    #include <iostream> 
    #include <Test\Test\Test.hpp> 
    
    int main(int argc, char *argv[]) 
    { 
        Test test; 
        std::cout << "Add 5 = " << test.add(5) << std::endl; 
        return 0; 
    } 
    

回答

5

底線是你必須編譯Test.cpp並以某種方式鏈接它。有兩個選項:

  1. 添加Test.cpp的到您的項目
  2. 創建庫項目,說TESTLIB。將Test.cpp添加到該項目並編譯它。然後將您的主項目與TestLib鏈接起來。

在第二種情況下,您可以在VisualStudio中擁有相關項目。這樣它將正確地調用正確的Debug/Release /等。當你建立你的主要項目的時候,lib的版本。它也會從正確的文件夾中得到它。例如。無需手動混淆鏈接器設置。

0

添加Test.hTest.cpp到項目(你應該能夠剛剛從資源管理器中拖動文件)。

您還需要指定額外的包含目錄,但聽起來好像您已經完成了排序。

+0

正如我所說 - 我可以添加Test.hpp和Test.cpp到這個簡單的項目,但我有其他不那麼簡單的項目需要單獨的目錄。例如,我將在本地機器上創建使用存儲在服務器/中央源代碼控制存儲庫中的代碼的項目。 – 2012-04-12 17:10:26

+0

你也說'我不處理任何圖書館'。如果您想跨多個項目重新使用代碼,請按照dpiskyulev的建議將通用代碼編譯爲.dll或庫。 – 2012-04-12 18:30:04

+0

沒有什麼可以阻止你從多個目錄導入到單個項目,如果這就是你的意思'我會堅持使用該設置,但我需要能夠使用不同目錄中的源代碼來處理我正在處理的項目' 。當您在項目設置中輸入目錄時,只需在目錄之間貼上';'。 – 2012-04-12 18:32:11