2013-04-13 164 views
4

我有一個複雜的C/C++應用程序,我正在處理的應該也是平臺無關的。到目前爲止,是UNIX/Windows兼容,它運行良好。但是,在VS2010上維護這個怪物是一場噩夢。我有以下文件結構:Visual Studio 2010項目文件過濾器

 
/
    sources 
    lib1 
     include 
     ... 
     src 
     ... 
    lib2 
     include 
     ... 
     src 
     ... 
    app3 
     include 
     ... 
     src 
     ... 
    builders 
    cmake 
     ... 
    make 
     ... 
    VS2010 
     vs2010.sln 
     lib1 
     lib1.vcxproj 
     lib1.vcxproj.filters 
     lib2 
     lib2.vcxproj 
     lib2.vcxproj.filters 
     app3 
     app3.vcxproj 
     app3.vcxproj.filters 

正如我們所看到的,因爲一切都與平臺無關,所以我必須將構建器與源代碼完全分開。恕我直言,這本身是一個非常好的做法,它應該由所有人強制執行:)

現在的問題... VS2010是完全無法使用,當涉及到在過濾器中組織include/sources文件。您必須通過重複執行「添加 - >新過濾器」,然後選擇「添加 - >退出項目」手動執行此操作。我有一個非常複雜的文件夾結構和每個包含文件夾中的文件。創建過濾器的任務成爲一整天的工作。另一方面,我可以將整個文件夾從資源管理器拖放到VS2010中的項目中,但是它會將所有的頭文件/源文件放在那裏,而沒有任何過濾器,使其毫無價值:在100個文件中無法搜索右邊一個沒有某種層次結構..

問題是: VS2010有一些模糊的方式導入文件夾並保留文件夾結構作爲過濾器?在我看來,創建VS2010的M $ FT人認爲M $ FT是叢林中唯一的動物,你必須用建設者項目污染sources文件夾,這樣你可以利用「顯示隱藏文件」將它們包含在項目中文件夾結構。這是荒謬的恕我直言...

+3

嚴重的是,爲什麼你保持VS2010項目文件,如果你使用的CMake? *(另外,請保持中立並停止寫入「M $」)* – Synxis

+0

您可以編寫一個生成'.filters'文件的相關部分的單線程腳本。在Linux或Cygwin下運行它,或者將其寫入'.ps1'或'.bat'。 – Notinlist

+0

@Synxix:你說得對。我很抱歉。我只是發泄...我必須保持VS2010左右,因爲我喜歡多樣性。我負責Windows維護的團隊的其他成員希望使用VS2010,因爲他們感到高效(或者他們認爲直到現在......)。 – shiretu

回答

8

您正在使用CMake,所以我建議你堅持只有這一點。您可以使用它生成makefile和VS2010項目文件(至少)。對於VS,生成的文件是sln和一堆vxproj(CMake腳本中的每個項目都有一個)。

在CMake文件中,您可以使用命令source_group對文件進行分組。根據源組自動爲vs生成過濾器。我不知道其他IDE如Code :: Blocks或NetBeans。

如果你想基於文件路徑[評論請求]自動分組

# Glob all sources file inside directory ${DIRECTORY} 
file(GLOB_RECURSE TMP_FILES 
    ${DIRECTORY}/*.h 
    ${DIRECTORY}/*.cpp 
    ${DIRECTORY}/*.c 
) 

foreach(f ${TMP_FILES}) 
    # Get the path of the file relative to ${DIRECTORY}, 
    # then alter it (not compulsory) 
    file(RELATIVE_PATH SRCGR ${DIRECTORY} ${f}) 
    set(SRCGR "Something/${SRCGR}") 

    # Extract the folder, ie remove the filename part 
    string(REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRCGR ${SRCGR}) 

    # Source_group expects \\ (double antislash), not/(slash) 
    string(REPLACE/\\ SRCGR ${SRCGR}) 
    source_group("${SRCGR}" FILES ${f}) 
endforeach() 
+0

謝謝你的建議。我會盡快嘗試源組訣竅,並回來的結果 – shiretu

+0

我接受了這個建議作爲一個很好的答案,因爲從理論上講,你可以做到這一點,並擁有所有這些過濾器。儘管如此,還是有很多工作要做。例如,在cmake中,我在* .c和* .cpp上進行了遍歷。對於頭文件,我只是將相關項目中的/ include添加到INCLUDE_DIRECTORIES中。在我看來,即使使用cmake,分組仍然是一項艱鉅的手動任務。此外,cmake生成工作sln,但非常非常混亂,根本不乾淨。我希望VS會有「從文件夾添加現有項目」之類的東西。 NetBeans也有它,日食也是如此,VS不是...... – shiretu

+1

爲了完整起見,人們可能會想知道爲什麼當我有cmake的時候我會保持「製造」。我保留它,因爲cmake不適用於所有平臺。以solaris爲例,是安裝cmake的真正冒險。看起來cmake畢竟不是那個平臺獨立的。這就是爲什麼堅持我的建議:始終讓建設者完全脫離源頭。 – shiretu

相關問題