2014-05-13 1 views
0

나는 프리 컴파일 된 헤더에 관한 기본 사항을 이해하고 있으며, 미리 컴파일 된 헤더를 라이브러리 내부에서 사용할 수없는 이유를 생각할 수는 없다고 생각하지만, 가능하지 않거나 없어야한다고 들었습니다. 완료 (어느 것을 기억할 수 없는지).미리 컴파일 된 헤더를 정적으로 링크 될 라이브러리의 일부로 사용할 수 있습니까?

공유 라이브러리가 여러 다른 사람들에 의해 정적으로 링크되는 프로젝트가 있고 공유 라이브러리 내에서 내 외부 STL/부스트 종속성에 대한 미리 컴파일 된 헤더를 사용하고 싶지만 가능한 경우 확실하지 않습니다. OS X 및 Windows 시스템을 대상으로하고 있습니다. 일반적인 검색은 stdafx.h과 관련된 Windows 솔루션을 더 많이 가리키는 것처럼 보입니다. 미리 컴파일 된 헤더를 사용하는 것이 일반적으로 Windows 관행이라고 생각하게 만듭니다.

는/내가 다른 프로젝트에 정적으로 연결 수 있습니다 라이브러리의 내부에 미리 컴파일 된 헤더를 사용한다 수 :

내 질문은 단순히 이것이다? 그렇지 않다면, 내 STL/Boost 의존성을 추구하는 모든 것을 위해 편의 헤더를 사용하고 있는가? 나는이 같은 것을 말하는 겁니다 :

// common.h 
#pragma once 

#include <boost/this> 
#include <boost/that> 
#include <string> 
#include <vector> 
#include <other_stl_header> 

// Foo.h 
#include "common.h" 

class Foo { ... } 

// Foo.cpp 

#include "Foo.h" 
... 

편집 : 내가 지정해야, 내가 미리 컴파일 된 헤더 내가 컴파일하고있어 도서관 이외의과 공유 될 것이라는 기대가 없다. 내 질문은 라이브러리의 컴파일에 사용되는 미리 컴파일 된 헤더를 만들 수 있는지 여부와 관련이 있습니다.

+0

미리 컴파일 된 헤더는 링크하기 전의 것입니다. 기본적으로 부분 오브젝트 파일로,이를 포함하는 모든 번역 단위의 템플리트 역할을합니다. 컴파일러 세부 사항이기 때문에 이들을 공유하는 것은 의미가 없습니다. – sehe

답변

1

,이 미리 컴파일 된 헤더에 대한 더 이상 사용이없는 그들이 연결 단계에 영향을주지 않습니다 (즉 공유 라이브러리와 링크 가능한 다른 포함되지 않습니다 구성 요소). 이 라이브러리를 사용하여 공유 라이브러리의 컴파일 속도를 높일 수는 있지만 그 자체입니다. 정적 라이브러리는 미리 컴파일 된 헤더 사용 여부와 상관없이 컴파일 결과입니다.

+0

당신의 대답은 그것이 가능하다는 것을 암시합니다. 그리고 컴파일에서 속도가 증가했다면, 나는 그것을해야합니다. 그 맞습니까? – vmrob

+0

공유 라이브러리의 컴파일 속도를 높일 수 있습니다. 가치가 있는지 여부가 귀하의 전화입니다. 그러나 질문에 따르면 주로 라이브러리와 정적으로 링크되는 다른 프로젝트의 컴파일 속도를 높이고 싶습니다. 공유 라이브러리 컴파일을 마친 후에는 변경 사항이 없습니다. 한 번만 수행됨) – SomeWittyUsername

+0

내 질문을 잘못 말했거나 정확하게 물어보기 어려운 것 같습니다. 필자는 공유 라이브러리에 미리 컴파일 된 헤더를 사용할 수 있는지 여부와 관계없이 라이브러리 클라이언트의 속도 향상에 관심이 없습니다. 나는 당신이 나의 질문에 대답했다고 믿습니다. – vmrob

1

미리 컴파일 된 헤더는 실행 파일 또는 모든 종류의 링크 가능한 형식이 아닙니다. 컴파일러 자체는 미리 컴파일 된 haeder에 대해 모든 종류의 형식을 정의 할 수 있습니다. 어쩌면 단순히 토큰 화 된 것일 수도 있고, 다른 일부를 포함하고 다른 포함의 정의가 이미 평가 된 것일 수도 있습니다. 미리 컴파일 된 헤더의 유일한 의도는 컴파일러의 속도 향상입니다.

gcc도 필요에 따라 미리 컴파일 된 헤더를 사용하지만이 기능을 사용하는 일반적인 방법은 아닙니다. gcc는 프리 컴파일 단계의 출력을 위해 .gch 개의 파일을 생성합니다.

귀하의 질문에 간단한 대답은 : 없음

당신이 편집을 완료하면
+0

중요한 추가 정보 : 두 컴파일러가 미리 컴파일 된 헤더를 가지고 있다고하더라도 두 컴파일러가 동일한 형식을 갖지는 않습니다. 따라서 라이브러리가 하나의 컴파일러를 사용하고 라이브러리의 사용자가 다른 컴파일러를 사용하면 호환되지 않을 수 있습니다. –

+0

동일한 컴파일러의 서로 다른 버전에서도 서로 다른 형식을 사용할 수 있습니다. – Klaus

+0

아마도 필자의 말은 오해의 소지가 있지만 미리 컴파일 된 헤더 정보가 라이브러리 파일에 컴파일 될 것이라는 기대가있었습니다. 이것이 일어날 일이 아닌가? 나는 프리 컴파일의 출력을 어떤 것으로도 공유 할 것을 기대하지 않았다. – vmrob