任何人都有成功的预编译头与GCC一起工作?我的尝试没有运气,我没有看到很多关于如何设置它的好例子.我已经尝试过cygwin gcc 3.4.4并在Ubuntu上使用4.0.
我肯定有成功.首先,我使用了以下代码:
#include#include 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的一个问候世界(见下面的链接).首先,我使用-H
gcc中的选项进行编译.它显示了它使用的大量标题列表.然后,我看看我的IDE(代码:: blocks)正在生成的编译标志,看到这样的东西:
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我无法让它在帖子.
BTW:我正在使用以下g ++
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
首先,请参阅此处的文档.
您可以像编辑任何其他文件一样编译标题,但是将输出放在后缀为的文件中.gch
.
因此,例如,如果您预编译stdafx.h,您将拥有一个预编译的头文件,当stdafx.h.gch
您包含时,将自动搜索该头文件stdafx.h
例:
stdafx.h中:
#include#include
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之后删除stdafx.h,您的编译也会起作用.
用于生成pch而不是-x
使用-x c++-header
.
pch.h:
// Put your common include files here: Boost, STL as well as your project's headers.
pch.cpp:
#include "pch.h" // Use the PCH here.
生成PCH:
$ g++ -x c++-header -o pch.h.gch -c pch.h
pch.h.gch必须与pch.h位于同一目录中!
我曾经设法让预编译的头文件在gcc下运行一次,我记得也有问题.要记住的是,如果不满足某些条件,gcc将忽略该文件(header.h.gch或类似文件),其列表可以在gcc预编译头文档页面上找到.
通常,最安全的做法是让构建系统将.gch文件编译为第一步,使用相同的命令行选项并将其作为源的其余部分执行.这可确保文件是最新的,并且没有细微差别.
首先让它使用一个人为的例子也是一个好主意,只是为了消除你的问题特定于项目中的源代码的可能性.
调用gcc的方式与为源文件调用gcc相同,但使用头文件.
例如
g++ $(CPPFLAGS) test.h
这会生成一个名为test.h.gch的文件
每次gcc搜索test.h时,它首先查看test.h.gch,如果找到它,它会自动使用它.
更多信息可以在GCC预编译标题下找到