2011-03-16 157 views
59

我有一些關於如何在VC 2010 C++項目中組織源文件的問題。包含的默認過濾器最終還是不夠,我將會有很多.cpp和.hpp文件,所以它會變得很混亂。我想在名爲「source」的項目根目錄下創建一個文件夾,然後在「源」中爲我想要使用的各種源文件類別創建文件夾。當我右鍵點擊解決方案時,我只能選擇添加過濾器,而不是文件夾。我可以在Windows資源管理器中手動創建文件夾,然後包含它們,但是然後我失去了添加過濾器的能力。有沒有辦法添加新的文件夾(不使用Windows資源管理器),仍然使用過濾器?VC2010 C++ - 組織源文件

此外,有沒有類似於$(CURDIR),我可以用來包含源文件文件夾而不需要絕對路徑?

在此先感謝您的幫助

回答

143

你是一個有點困惑Studio如何目視着C++文件工作,但沒關係,因爲該文件是糟糕的。第一件事情:與C#或Java不同,項目中文件的排列與磁盤上文件的排列無關。文件和文件夾不是「在」項目中,真的;該項目只列出了文件和文件夾的名稱和路徑,這些文件和文件夾必須已經存在於您的磁盤上。

通常,您將創建文件夾的佈局,並在這些文件夾中包含源文件。您可以在Visual Studio的之外執行此操作。你也創建一個項目文件。當您向項目「添加文件」時,您所做的只是告訴項目在磁盤上找到文件的位置。

讓我們用一個具體的例子來工作,我會告訴你如何組織它。假設您正在製作一個名爲SuperCalc的圖形計算器程序。您將擁有一個Source文件夾,然後在Source內部創建文件夾以容納不同的文件。假設你創建文件夾爲:

  • SuperCalc\Source\Input
  • SuperCalc\Source\Math
  • SuperCalc\Source\Math\Matrix
  • SuperCalc\Source\Output

你的Source 3個子目錄:InputOutputMathMath子目錄有一個名爲Matrix的子目錄。輸入,數學,矩陣和輸出中將包含.cpp文件。您將使用Windows資源管理器或命令提示符創建這些目錄(文件夾)。

現在您還需要創建一個解決方案文件(SuperCalc.sln)和一個項目文件(SuperCalc.vcxproj )。在Visual Studio中執行此操作。通常,項目文件位於解決方案目錄的子文件夾中;這將由Visual Studio自動完成。爲 解決方案文件選擇一個位置 - 它應該位於與源代碼相同的目錄結構(文件夾樹)中。我建議把它旁邊的源目錄中:

  • SuperCalc\Build

走進VS並挑選File > New > Project > Visual Studio Solutions > Blank Solution File。給解決方案一個名稱(也許是「SuperCalc」)和一個位置(我們剛纔在SuperCalc\Build目錄中選擇的位置)。它將爲您創建解決方案文件。

現在右鍵單擊Solution Explorer中的解決方案(「Solution SuperCalc,0個項目」),然後選取Add > New Project。選擇一個名稱 - 這將是您的程序可執行文件的名稱,如「SuperCalc」!選擇Win32,或者Win32控制檯應用程序(這是一個DOS控制檯程序)或Win32項目(這是一個普通的Windows GUI程序)。通常我會點擊應用程序設置進行一些重要的更改:首先,我選擇Empty Project,因爲我不想讓Visual Studio爲我創建文件和代碼,除非我告訴它。當它按照我想要的方式設置時,我點擊FINISH。

現在,您已經獲得了由Visual Studio創建的解決方案文件和項目。您還擁有您的源代碼,或者至少是您的源代碼所在的目錄結構(文件夾樹),在Visual Studio之外創建。現在是把這兩件事聯繫在一起的時候了。

如果需要,可以將所有源文件列入項目的源文件過濾器。即使它們來自不同的目錄(輸入,矩陣等),磁盤上文件的位置與它們在項目中的外觀之間也沒有必要的關係。但是,如果您有很多文件,那麼創建「子過濾器」,在「源文件」過濾器內部進行過濾,併爲它們提供源的子文件夾的名稱會更容易。這樣,您就可以在項目文件中複製磁盤目錄的結構。

右鍵單擊「SuperCalc」項目的源文件篩選器,然後選擇添加>添加新篩選器。給它起一個名字Input(SuperCalc \ Source目錄中的第一個)。還要創建過濾器MathOutput。右鍵單擊Math過濾器並選擇添加>添加新過濾器,以創建一個名爲Matrix(Math內部)的子過濾器。現在你有這些過濾器

 
    SuperCalc 
     Source Files 
     Input 
     Math 
      Matrix 
     Output 

它平行的目錄(文件夾)之前創建。 這純粹是人類便利的安排。 Visual Studio不瞭解任何特殊的內容。如果你只是告訴VS「添加文件」,它不會把文件放在正確的過濾器中。你必須告訴它它放在哪裏。

要添加或創建.cpp文件,請選擇與.cpp文件所在目錄對應的篩選器名稱。因此,要添加或創建文件SuperCalc\Source\Math\Matrix\matrix_multiply.cpp,請在解決方案資源管理器中右鍵單擊Matrix篩選器,然後選擇添加>添加新文件或添加現有文件。 (添加現有文件適用於已經寫入matrix_multiply.cpp並且您只是想告訴項目它在哪裏。)使用對話框導航到Source\Math\Matrix目錄。對整個程序中的所有源文件重複此過程。

您還有一個問題:「是否有類似於$(CURDIR)的東西可用於包含源文件文件夾而不需要絕對路徑?」你很幸運:Visual Studio項目不使用絕對路徑!他們使用相對路徑。項目文件存儲從包含.vcxproj文件的目錄到包含源文件的目錄所需的相對路徑。因此,如果您創建了SuperCalc.slnSuperCalc.vcxproj(我建議)(SuperCalc\Build目錄),並且將源文件添加到源子目錄中,則可以查看SuperCalc。使用vcxproj文件記事本,你會看到線,如:

 
<ClCompile Include="..\..\..\Source\Math\Matrix\matrix_multiply.cpp" /> 

由於沒有絕對路徑,你可以把整個SuperCalc目錄樹和別的地方移動它,它都會仍然可以工作。不需要像$(CURDIR)這樣的環境變量。

要知道的最後一件事:因爲您將源文件放在多個目錄中,所以可能會遇到與.h或.hpp文件相關的#include問題。您必須告訴編譯器頭文件所在的目錄。它們可能分散在多個目錄中。因此,編輯項目設置:右鍵單擊解決方案資源管理器中的項目名稱,選擇屬性,然後深入到配置屬性> C/C++>常規。屬性表中的第一個字段顯示「其他包含目錄」。 在你做任何事情之前,點擊配置下拉菜單並選擇所有配置。如果您同時擁有32位和64位版本,請點擊平臺下拉菜單並選擇所有平臺。現在轉到「其他包含目錄」並將所有路徑添加到所有源目錄中,並指定相對於項目文件目錄的路徑。所以對於SuperCalc例如,它看起來像:

 
..\..\..\Source\Input;..\..\..\Source\Math;..\..\..\Source\Math\Matrix;..\..\..\Source\Output 

一旦做出改變,就像來源\數學\矩陣\ matrix_multiply.cpp一個文件可以有一個 線

#include "input_configuration.hpp" 

到#包括來自Input目錄的一個文件,它將全部工作。

(如果不是所有剛工作時,通常的做法是重新回到項目屬性和小提琴與..\序列的數目在附加包含目錄的前面。記住,每次你去作你必須選擇改變所有配置再次 - 。否則你的改變將只適用於當前配置(調試或釋放)該設置不粘膩

+1

此外,您還可以定義用戶宏如。 $(源)通過屬性表(.props)。我建議儘可能多地在屬性表中設置項目設置,因爲許多項目可能會共享設置。 – 2012-06-11 20:16:12

+1

很好的答案。我創建了與我的目錄結構相匹配的過濾器,但我遇到了一個經常性的頭痛問題,您稍微觸及了一下。 VS不知道我的過濾器是鏈接到目錄。當我按順序添加代碼時,這會變得很痛苦:foo.h,foo.c,bar.h,bar.c.我必須記住不斷更改目錄到正確的位置。 VC++會記住你的最後一個目錄,所以它總是落後一步。 我向MS發佈了一個建議,允許將目錄與過濾器相關聯。是這裏。如果這也讓你感到厭倦,請提高這個建議。 http://tinyurl.com/bud4zsv – 2013-03-07 22:59:04

+1

甜!在2015年的社區中,一個空的解決方案是在新的>項目...>其他項目類型> Visual Studio解決方案>空白解決方案 – 2015-07-28 16:16:34

-2

如果你想創建解決方案,項目與您的源代碼不同,您可以更改您的工作目錄:

Project > Properties > Configuration Properties > Debugging > Working Directory

21

它實際上是可能的,以查看(和操作)通過Visual Studio中物理文件結構,如在this SO post描述:

頁眉/源文件不是由Visual Studio強加的要求。 這只是默認佈局,它是虛擬的,而不是物理的。如果您在解決方案資源管理器中單擊「顯示所有文件」,它將顯示 文件夾樹,因爲它位於硬盤驅動器上,您可以將其操作爲 ,您認爲它合適。

+1

您已經度過了我的一天!非常感謝你! 我只有一個問題:爲什麼它不是通過默認設置空洞? @thomthom「我幾個小時都在尋找這樣的解決方案!」 - 我也是) – Maks 2015-03-18 10:34:19

0

使用構建系統如CMakePremake整理文件的時候可以幫助,它在幫助你自己的代碼移植到其他平臺的好處。 Here是關於這個問題的一個很好的介紹。

因爲它可能對某人有所幫助,所以我還應該補充說,將源文件與項目文件分開(*.vcxproj)使創建新文件變得更加困難,因爲Visual Studio默認想要在與您的項目相同的文件夾。到目前爲止我發現的這個問題的解決方法是使用Visual Assists擴展,因爲它允許相對於目錄或當前打開的文件添加新文件。有關詳細說明,請參閱this

0

我晚了,但我建議對接受的答案。主要原因是如果對代碼可移植性。相反,我建議:

  1. 若要創建Visual Studio以外的文件夾和子文件夾的佈局(與接受的答案相同,但接下來的點不同)。裏面每個子文件夾創建一個includesrc文件夾
  2. 然後在配置屬性> C/C++>常規>「附加包含目錄」(針對所有配置和所有Plateforms)添加文件夾這是所有子文件夾的基礎。
  3. 添加src文件並在這些子文件夾中包含文件。

  4. 最後包含每個頭文件使用親屬路徑到這個基礎文件夾。

需要明確的是:如果你的項目的佈局如下:

MyProjet 
    Math 
    include 
     random.h 
     functions.h 
    src 
     random.cpp 
     functions.cpp 
    Probability 
     include 
     normal.h 
     src 
     normal.cpp 

你應該在functions.cpp以下包含語句:

#include"Math/include/functions.h" 

,如果您還需要在functions.cpp中使用normal代碼,那麼functions.cpp的頂部應如下所示:

#include"Math/include/functions.h" 
#include"Probability/include/normal.h" 

這樣做,你就可以無痛苦重新使用你的數學子文件夾中的另一個項目(B):剛剛加入MyProject基礎文件夾到「附加包含目錄」的項目B的

關鍵是要將一個基文件夾放入「Additional Include Directories」屬性中。

PS:2015年VS的智能感知功能有很大幫助寫#include...

+1

這很脆弱。最好將搜索目錄提供給編譯器,而不是將代碼頭路徑讀入源文件。 – ThomasMcLeod 2017-04-21 14:10:30