2013-05-12 3 views
1

GCC를 사용하여 공유 라이브러리에 대한 미리 컴파일 된 헤더 파일을 만들려고합니다. 필요한 구성을 만들고 구축을 위해 노력 후, 나는 이러한 경고를 가지고 :GCC를 사용하는 공유 라이브러리 프로젝트의 미리 컴파일 된 헤더 파일

: 시간의 검색 후, 나는 PCH 공유 코드로 작동하지 않는 것이 좋습니다 것이 코드 조각을 발견
cc1plus: warning: ./PrecompiledHeaders.h.gch/.c++: created and used with different settings of -fpic [enabled by default] 

/* -fpic and -fpie also usually make a PCH invalid. */ 
if (data[0] != flag_pic) 
    return _("created and used with different settings of -fpic"); 
if (data[1] != flag_pie) 
    return _("created and used with different settings of -fpie"); 
data += 2; 

그래서 라이브러리를 정적 라이브러리로 변경 했으므로 오류가 사라지고 컴파일 시간이 단축되었습니다! 그렇다면 실제로 공유 라이브러리가있는 PCH를 사용할 수 있습니까? 예인 경우이 문제가 있습니까?

답변

3

게시 한 메시지와 코드는 PCH를 공유 코드와 함께 사용할 수 없다고 제안하지 않습니다. -fpic없이 코드를 컴파일 할 때 -fpic으로 컴파일 된 PCH 파일을 사용할 수 없으며 그 반대의 경우도 마찬가지입니다. -fpie와 동일합니다.

아키텍처에 따라 -shared-fpic 또는 다른 옵션을 의미 할 수 있습니다.

나머지 코드를 컴파일 할 때와 동일한 옵션으로 헤더를 미리 컴파일해야합니다. 정적 및 동적 빌드 모두에 대해 PCH를 사용하려면 미리 컴파일 된 두 개의 헤더 세트가 필요합니다.

+0

감사합니다. 방금 추가 한 답변을 보시고 이에 대한 의견이 있으면 알려주십시오. – Rafid

+0

-fPIC는 공유 객체에 대한 x86_64의 유일한 옵션입니다. 나는 복잡한 세부 사항에 너무 익숙하지 않다, 그러나 당신은 여기에서 정보 & 연결을 더 찾아 낼 것이다 : http://stackoverflow.com/questions/3961446/why-does-gcc-not-implicitly-supply-the-fpic- flag-when-compiling-static-librarie - 그 이유는 정확히 어떤 플래그를 추가해야 하는지를 알려주지 않고 '동일한 옵션 사용'이라고 말했기 때문입니다. 정확한 옵션은 아키텍처에 따라 다릅니다. – Mat

1

매트의 대답은 정확하지만, PCH 파일을 컴파일 할 때 이미 -fpic을 추가하려고했기 때문에 문제가 해결되지 않았고 작동하지 않았습니다. -fpic 대신 -fPIC 플래그가 필요하다는 것이 밝혀졌습니다. 이유는 확실하지 않지만 PCH 파일이 너무 크기 때문에 가능성이 있습니다. 인용 GCC 설명서 쪽

-fPIC : 대상 시스템에 대해 지원되는 경우, 동적 적합한 위치 독립 코드 연결 글로벌 오프셋 테이블의 크기에 어떠한 제한을 회피를 방출한다. 이 옵션은 m68k, PowerPC 및 SPARC에서 차이를 만듭니다.

마지막 진술로 m68k, PowerPC 및 SPARC에만 차이가 있지만 컴퓨터는 Intel i7 (3 세대)입니다.

관련 문제