GCC로 미리 컴파일 된 헤더 얻는 데 성공

누구든지 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의 안녕하세요 세계였습니다 (링크는 아래 참조). 먼저 -Hgcc 의 옵션으로 컴파일했습니다 . 그것은 그것이 사용한 엄청난 헤더 목록을 보여주었습니다. 그런 다음 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를 제거해도 컴파일이 작동합니다.


답변

-xC ++에 대한 지정 헤더가 미리 컴파일 -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
....