任何人都可以獲得使用GCC的預編譯頭文件嗎?我的嘗試中沒有運氣,我還沒有看到很多好的例子來說明如何設置它。我嘗試過使用cygwin gcc 3.4.4並在Ubuntu上使用4.0。使用GCC預編譯頭文件
回答
我已經設法在gcc下使用過預編譯頭文件,並且我記得還有問題。需要記住的是,如果不符合某些條件,gcc將忽略該文件(header.h.gch或類似文件),其列表可在gcc precompiled header documentation page上找到。
通常,將構建系統作爲第一步編譯.gch文件是最安全的,它具有與其他源代碼相同的命令行選項和可執行文件。這確保文件是最新的,並且沒有細微差別。
它可能是一個好主意,首先讓它與一個人爲的例子一起工作,只是爲了消除您的問題是特定於項目中源代碼的可能性。
調用gcc的方式與您爲源文件調用它的方式相同,但是使用頭文件。
例如
g++ $(CPPFLAGS) test.h
這會產生一個呼籲test.h它首先尋找test.h.gch test.h.gch
每次GCC搜索文件,如果找到它,它會自動使用它。
更多信息可以GCC Precompiled Headers
我使用gcc 3.4,g ++ stdafx.h不會編譯,你會得到錯誤「g ++:彙編頭文件請求」,但是這樣會編譯,不知道是不是我想要的:「g ++ -c - x C++ stdafx.h -o stdafx.h.pch「 – stefanB 2009-05-15 01:56:46
Firstly, see the documentation here下找到。
您可以像編譯任何其他文件一樣編譯頭文件,但是會將輸出內容放在後綴爲.gch
的文件中。
因此,舉例來說,如果你預編譯stdafx.h中,你將有機會自動搜索名爲stdafx.h.gch
隨時隨地預編譯的頭,你包括stdafx.h
例子:
stdafx.h中:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
然後編譯如下:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
如果步驟1
感謝您給出一個工作示例! – nobar 2010-01-18 06:44:46
我都肯定有成功後刪除stdafx.h中你的編譯甚至會工作。首先,我使用下面的代碼:
#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace std;
using namespace boost::xpressive;
//A simple regex test
int main()
{
std::string hello("hello world!");
sregex rex = sregex::compile("(\\w+) (\\w+)!");
smatch what;
if(regex_match(hello, what, rex))
{
std::cout << what[0] << '\n'; // whole match
std::cout << what[1] << '\n'; // first capture
std::cout << what[2] << '\n'; // second capture
}
return 0;
}
這只是一個來自Boost Xpressive的hello世界(參見下面的鏈接)。首先,我編譯了gcc中的-H
選項。它顯示了它使用的標題的巨大列表。然後,我看了一下編譯標誌我的IDE(代碼::塊)的生產和看到的東西是這樣的:
g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
所以我寫了一個命令編譯Xpressive.hpp有確切的文件相同的標誌:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
我與-H
再次編譯原碼,並得到此輸出:
g++ -Wall -fexceptions -H -g -c main.cpp -o obj/Debug/main.o ! /usr/local/include/boost/xpressive/xpressive.hpp.gch main.cpp . /usr/include/c++/4.4/iostream .. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h .. /usr/include/c++/4.4/ostream .. /usr/include/c++/4.4/istream main.cpp
這個!意味着編譯器能夠使用預編譯的頭文件。 x意味着它無法使用它。使用適當的編譯器標誌至關重要。我摘下了-H並進行了一些速度測試。預編譯頭文件從14秒改進爲11秒。不壞但不是很好。
注意:以下是示例的鏈接:http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples我無法在帖子中找到它。
順便說一句:我使用下面克++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
爲了生成PCH而不是使用-x c++
使用-x c++-header
。
pch.h:
<put your common include files here>
pch.cpp:
#include "pch.h"
生成PCH:
g++ -x c++-header -o pch.h.gch -c pch.cpp
的pch.h.gch必須在相同的目錄中pch.h!
- 1. CMake,Qt,gcc和預編譯頭文件
- 2. 使用gcc預編譯頭文件的怪異行爲
- 3. 在gcc中使用預編譯頭文件
- 4. 使用GCC的共享庫項目的預編譯頭文件
- 5. 如何在gcc和make中使用預編譯頭文件?
- 6. 使用Autotools預編譯頭文件
- 7. 預編譯頭文件
- 8. C++ - 預編譯頭文件
- 9. gcc錯誤:無法創建預編譯頭文件
- 10. ccache是否完全超越gcc的預編譯頭文件?
- 11. GCC編譯時間不會從預編譯頭文件中獲益太多
- 12. 預編譯頭文件和編輯頭文件
- 13. 尋找預編譯頭使用時跳過頭文件
- 14. gcc編譯器在編譯時查找頭文件在哪裏?
- 15. 由arm-gcc編譯器編譯的c代碼的頭文件
- 16. 使用gcc與內核頭文件編譯Linux內核模塊
- 17. 使用gcc編譯時覆蓋系統頭文件
- 18. 如何在使用GCC編譯C++時包含C11頭文件?
- 19. 預編譯頭,
- 20. Boost預編譯頭文件問題
- 21. 如何避免預編譯頭文件
- 22. 預編譯頭文件設計問題
- 23. 預編譯特徵頭文件
- 24. Xcode 6.1預編譯頭文件
- 25. Objective-C++預編譯頭文件
- 26. 預編譯頭文件和Visual Studio
- 27. OpenGL預編譯頭文件跳過
- 28. 高效共享預編譯頭文件
- 29. xcode的gyp預編譯頭文件
- 30. 預編譯頭文件和MSBuild
我試過了,我有預編譯頭文件的最佳用例,因爲我的c源代碼是編譯器生成的而不是用戶編寫的。 Sun Studio,特別是Visual Studio改善了構建時間。在gcc上它變得更糟,沒有預編譯頭文件。這是3.4與4.x沒有testet,但速度和gcc是互斥的。 – Lothar 2009-11-04 12:33:02
@Lothar代碼是什麼?我發現g ++的速度比最近的Visual Studio編譯器快10倍,在一些模板化的代碼上。 – 2014-10-08 15:30:54
我沒有在我的C++代碼中使用模板。這只是C +異常處理+漂亮的C++擴展。即使在這個問題出現6年之後,VS2010的速度也要快一些。但在此期間,我有16個核心,所以我可以忍受它。 – Lothar 2014-11-09 05:24:25