누구든지 GCC로 작업하는 미리 컴파일 된 헤더를 얻는 데 성공 했습니까? 나는 내 시도에 운이 없었고 그것을 설정하는 방법에 대한 많은 좋은 예를 보지 못했습니다. cygwin gcc 3.4.4에서 시도하고 Ubuntu에서 4.0을 사용했습니다.
답변
나는 확실히 성공했습니다. 먼저 다음 코드를 사용했습니다.
#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의 안녕하세요 세계였습니다 (링크는 아래 참조). 먼저 -H
gcc 의 옵션으로 컴파일했습니다 . 그것은 그것이 사용한 엄청난 헤더 목록을 보여주었습니다. 그런 다음 IDE (code :: 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 ++-벽 -f 예외 -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 <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 단계 후에 stdafx.h를 제거해도 컴파일이 작동합니다.
답변
-x
C ++에 대한 지정 헤더가 미리 컴파일 -x c++-header
하지 -x c++
. PCH 사용 예는 다음과 같습니다.
pch.h
:
// Put your common include files here: Boost, STL as well as your project's headers.
main.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
에서 위 명령을 실행해야합니다 pch.h
.
답변
나는 과거에 한 번 gcc에서 작동하는 미리 컴파일 된 헤더를 얻을 수 있었고 그때도 문제가 있었던 것을 기억합니다. 기억해야 할 점은 특정 조건이 충족되지 않으면 gcc가 파일 (header.h.gch 또는 이와 유사한)을 무시한다는 것입니다.이 목록은 gcc 사전 컴파일 된 헤더 문서 페이지 에서 찾을 수 있습니다 .
일반적으로 빌드 시스템에서 나머지 소스와 동일한 명령 줄 옵션 및 실행 파일을 사용하여 .gch 파일을 첫 번째 단계로 컴파일하는 것이 가장 안전합니다. 이렇게하면 파일이 최신 상태이며 미묘한 차이가 없습니다.
문제가 프로젝트의 소스 코드와 관련 될 가능성을 제거하기 위해 먼저 인위적인 예제로 작업하는 것도 좋은 생각입니다.
답변
소스 파일에 대해 호출하는 것과 동일한 방식으로 헤더 파일을 사용하여 gcc를 호출하십시오.
예 :
g++ $(CPPFLAGS) test.h
그러면 test.h.gch라는 파일이 생성됩니다.
gcc가 test.h를 검색 할 때마다 먼저 test.h.gch를 찾고 발견하면 자동으로 사용합니다.
자세한 정보는 GCC 사전 컴파일 된 헤더 에서 찾을 수 있습니다.
답변
확인하십시오 -include your_header.h
이것이 내가 bits/stdc++.h
컬렉션을 미리 컴파일하고 사용하는 방법 입니다.
암호
#include <bits/stdc++.h>
그런 다음 -H로 내 파일을 컴파일하고 출력을 확인하여 lib를 찾았습니다.
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
내가 본 곳
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
그래서 나는 bits
현재 디렉토리 안에 새 디렉토리를 만들고 stdc++.h
거기에서 복사 했습니다.
그리고 나는 달렸다
g++ bits/stdc++.h -O3 -std=c++14 -pthread
생성 한 bits/stdc++.gch
일반적으로 다음을 통해 코드를 컴파일했습니다.
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
,하지만 수정해야했습니다.
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
그것은 단지에 해결로 .gch
대신 파일 .h
에 -include bits/stdc++.h
그 날의 핵심이었다. 명심해야 할 다른 것은 당신이 컴파일해야한다는 것입니다 *.h
당신이 당신의 컴파일과 거의 동일한 매개 변수와 헤더 파일을 *.cpp
. 내가 포함하지 않았 -O3
거나 미리 컴파일 된 헤더를 -pthread
무시 했을 때 *.gch
.
모든 것이 올바른지 확인하려면 비교 결과를 통해 시차를 측정 할 수 있습니다.
time g++ sol.cpp ...
또는 실행
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
다시 헤더 경로를 찾고 !
라이브러리 경로 이전에 예를 들어
! ./bits/stdc++.h.gch
....