2010-07-26 2 views
7

저는 약 15 개의 클래스와 그 멤버 함수, 그리고 C++로 컴파일 된 정적 라이브러리를 가지고 있으며, 컴파일 된 것은 거의 14 메가 바이트입니다. Google의 고밀도 해시 테이블 라이브러리와 Windows 용 GMP와 같은 MPIR에 링크되어 있지만 일반 EXE에서 수행 한 결과 몇 킬로 바이트였습니다. 왜 그렇게 대단한가요? 크기를 줄이려면 어떻게해야합니까? 훨씬 더 복잡한 나의 프로그램보다 훨씬 더 복잡한 프로그램이있는 것 같습니다. 카메라 C++로 컴파일 내 정적 라이브러리가 너무 큰 이유는 무엇입니까?

, 커맨드 라인은 :

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" 
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t 
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\" 
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue 
+0

좀 더 자세한 정보를 제공 할 수 있습니까? 컴파일러 플래그 등 – Dusty

+0

Visual C++로 컴파일 된 명령 줄 : /Zi/nologo/W3/WX-/O2/Oi/Oy-/GL/D "WIN32"/ D "NDEBUG"/ D "_CONSOLE "/ D"UNICODE "/ D"유니 코드 "/ Gm-/EHsc/GS/Gy/fp : 정밀/Zc : wchar_t/Zc : forScope /Fp"Release\ang.pch"/ Fa "Release \"/ Fo " \ "/Fd"Release\vc100.pdb"/ Gd/analyze-/errorReport : queue – Foglio

+0

플래그가 아닌 명령 줄 *을 해제하십시오. – Foglio

답변

16

정적 라이브러리는 상당히 다른 형태는 최종 이진; 부분적으로는 꽤 많은 정보가 있기 때문입니다. 본질적으로 정적 라이브러리는 번역 단위에서 생성 된 모든 .obj 파일의 ZIP과 같은 역할을합니다. 이렇게하면 링커가 사용하지 않는 함수를 버릴 수 있으며 LTCG를 사용하는 경우 인라이저는 모듈 간 의사 결정 및 기타 최적화를 수행 할 수 있습니다.

또한 일부 컴파일 모드에서는 .lib에 직접 디버깅 기호가 포함되어 별도의 .pdb 파일이 필요하지 않습니다.

일반적으로 정적 라이브러리 크기는 걱정할 필요가 없습니다. 링커는 최종 실행 파일을 빌드 할 때 모든 추가 정보를 버립니다.

+0

링커는 중복 코드 나 데드 코드 등을 던집니다. – greyfade

+0

@greyfade : 실제로 컴파일러가 수행합니다;) –

+0

@Billy ONeal : * 링크 타임에 *? – greyfade

관련 문제