2014-11-04 5 views
6

내 코드는 libcxx, sdl 및 다른 libs를 항상 사용합니다. #ifdef #include #endif와 같은 복잡한 조건이 있어도 모든 헤더에 다른 헤더가 포함될 수 있으므로 .pch를 생성 할 수 있습니다. 그래서 필요한 헤더 파일 목록을 이해하는 것이 어렵습니다. 해당 폴더를 .pch로 만들려면 어떻게해야합니까?이 경우에 이러한 .pch 성능을 사용하는 것은 어떻습니까?.pch 헤더를 많이 생성하는 방법?

업데이트 : 중요한 경우 Clang (GCC 아님)과 함께 사용하고 Clang C API . UPDATE2 : 하나의 헤더 파일에 대한

내가 만든 PCH :

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch 
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++ 

하지만, 여러 파일에 대해 pch를 생성 할 수 없었습니다.

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch 
clang: error: cannot specify -o when generating multiple output files 
+0

어딘가에 gcc의 STL이 어떻게 든 미리 컴파일되어 있다고 읽었습니다. 누군가 이것을 확인할 수 있습니까? – alfC

답변

1

첫 번째로 pcc는 Microsoft 컴파일러에서만 gcc와 함께 사용하지 않았습니다.

#ifdef 등의 조건은 컴파일 전에 모두 해결되므로 전처리 변수를 변경하면 PCH 파일이 컴파일됩니다. 그래서 필요한 lib의 모든 파일을 추가하십시오.

일반적으로 자주 변경되지 않는 모든 헤더 (즉, 안정적인 외부 라이브러리 및 시스템의 일부)를 포함합니다.

pch 파일에 헤더를 여러 번 포함하는 것에 대해 너무 걱정하지 마십시오. 이 파일은 매우 자주 컴파일되지 않으므로 여기서 높은 컴파일 시간을 무시할 수 있습니다.

당신이 pch 파일에 모든 것을 포함 할 때 실행 파일 크기가 커지면 확실하지 않습니다. 이는 pch 파일에 추가했기 때문에 실행 파일에 컴파일 된 코드 부분을 사용하지 않는 경우를 참조하기 때문에이 경우 일 수 있습니다. 테스트 해 볼 수 있습니다.

내 경험에 비추어 볼 때, 또 다른 중요한 질문은 컴파일 할 때 또는 링크 할 때 컴파일 성능이 느린 지 여부입니다.

링크 시간이 길면 코드의 머리글에 헤더를 너무 많이 포함 할 가능성이 큽니다.

헤더 파일의 전달 선언을 사용하고 .cpp 파일의 헤더 만 포함하여이 기능을 최적화 할 수 있습니다. 커다란 모 놀리 식 프로젝트가 있었고 컴파일/링킹을위한 가장 큰 성능 향상은 가능한 한 많이 선언하여 헤더 종속성을 제거하는 것이 었습니다.

증분 컴파일은 매우 잘 작동하지만 증분 링크는 작동하지 않기 때문입니다.

여기에 앞으로 선언에 대한 짧지 만 좋은 할 일의의 컴파일 및주의 사항입니다 : 는 http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

+0

필자의 경우 필자의 .pch 사용의 주요 목적은 헤더리스트로 컴파일/링크 시간을 줄이는 것이 항상 동일하다는 것입니다. 일부 헤더를 여러 번 포함하는 것에 대해 걱정하지 않지만 pch 파일에 불필요한 헤더를 추가하는 것에 대해 걱정하지 마십시오. 그게 질문입니다. – 4ntoine

2

GCC 컴파일러는 하나 포함 미리 컴파일 된 헤더, as explained in this answer 잘 작동합니다.당신이 GCC에서 PCH를 사용하려는 경우, 당신은 응용 프로그램의 모든 번역 단위에 대한 하나의 헤더 파일이 있어야합니다 (그리고 그들 각각은 정확히 단일#include 지시어로 시작한다)

I을 이러한 상황은 일부 미리 컴파일 된 헤더를 지원하는 다른 컴파일러에 유용합니다.

C++ 표준의 이후 버전 (게시 C++14)은 모듈 메커니즘을 정의 할 수 있습니다. 예 : n4047 제안.

미리 컴파일 된 헤더는 매우 컴파일러 전용이므로 (GCC에서는 GCC 4.9.1에서 GCC 4.9.2로 마이그레이션 할 때 작동하지 않을 수도 있음), 너무 많이 의존해서는 안됩니다.

+0

gcc에 대한 정보를 제공해 주셔서 감사합니다. 실제로 나는 clang을 위해 그것을 필요로한다고 덧붙여 야했다. 그러나 나는 그것이 중요하다는 것을 모르고 있었다. 내가 여기 (http://clang.llvm.org/docs/PCHInternals.html)를 읽을 때 – 4ntoine

+0

을 읽었다. clang의 pchs는 보통 헤더의 묶음을 위해 생성된다. . – 4ntoine

관련 문제