2012-09-23 39 views
5

我正在開發一個大型項目,必須在多個環境下構建,主要是linux/gcc和windows/msvc。爲了加速構建,我們使用預編譯頭文件。在gcc上沒有預編譯頭文件的加速(但與Visual Studio大加速)

Windows實現非常高效:在我的四核超線程i7構建時間從9分鐘下降到1.5分鐘。然而,使用預編譯頭文件似乎並沒有提高性能:在這兩種情況下,它在同一臺計算機上的虛擬框下22分鐘內構建,或者在真實服務器上約40分鐘。

所以我想明顯的是,我不知何故有什麼錯,並且預編譯的頭文件沒有插入。但是我找不到。

我們的Makefiles是由CMake生成的,所以我可以複製粘貼用於編譯頭文件的代碼和使用它們的對象文件。

創建報頭:

/usr/bin/c++ -O3 -DNDEBUG --no-warnings "-I/mnt/code/server a/src/game" 
"-I/mnt/code/server a/src/game/vmap" "-I/mnt/code/server a/dep/include/g3dlite" 
"-I/mnt/code/server a/dep/include" "-I/mnt/code/server a/src/shared" 
"-I/mnt/code/server a/src/framework" "-I/mnt/code/server a/buildlinux" 
"-I/mnt/code/server a/buildlinux/src/shared" -I/usr/include/mysql 
"-I/mnt/code/server a/dep/acelite" -DDO_MYSQL -DHAVE_CONFIG_H 
-DVERSION=\"0.6.1\" -DSYSCONFDIR=\"../etc/\" -D_RELEASE -D_NDEBUG -x c++-header 
-o "/mnt/code/server a/buildlinux/src/game/pchdef.h.gch" "/mnt/code/server 
a/src/game/pchdef.h" 

編譯的對象文件:

/usr/bin/c++ $(CXX_DEFINES) $(CXX_FLAGS) "-I/mnt/code/server 
a/buildlinux/src/game" -include pchdef.h -Winvalid-pch -o 
CMakeFiles/game.dir/AccountMgr.cpp.o -c "/mnt/code/server 
a/src/game/AccountMgr.cpp" 

見解是理解的,即使它們不直接從上面的代碼段中獲得。

+1

很幸運,我發現在GCC中使用預編譯頭文件甚至會降低構建速度。 CLANG在前段時間表現較好,但現在似乎使用預編譯頭文件毫無價值,使得MSVC成爲唯一受益於它的編譯器。 – Lothar

回答

1

在GCC中使用預編譯頭文件時,需要注意幾件事情。首先,必須使用與編譯cpp文件相同的參數來創建預編譯頭。另外我假設你已經在AccountMgr.cpp中包含了預編譯頭文件?

嘗試使用-H標誌進行編譯,這將輸出哪些包含文件正在被考慮。檢查是否提到了pchdef文件,並查看正在分析哪些其他包含文件。要讓gcc抱怨無效的PCH文件,請考慮使用-Winvalid-pch

+0

如果你看看這些命令,你會看到我已經在使用'-Winvalid-pch'。我也沒有在'AccountMgr.cpp'中包含頭文件,但頭文件被包含在'-include'選項中。我會嘗試使用'-H'標誌並回報。 – Norswap

+0

我用「-H」標誌運行了它,它肯定會看到並使用預編譯的頭文件。神祕加深。 – Norswap

+0

「uses」是指顯示的包含文件列表顯示預編譯的包含文件不再包含在內?即嘗試用-include和一次運行-H一次。如果輸出是相同的,那麼你的PCH不包括任何相關的內容(或者AccountMgr.cpp沒有使用很多內容),你只是浪費了使用PCH的時間,或者這是一個新的線索。 – dseifert