2016-10-21 1 views
-2

동적으로 링크 된 300 KB 애플리케이션이 있었기 때문에 정적 링크 빌드를 시도하기로 결정했습니다.정적으로 연결된 애플리케이션 크기 축소

나는 다음과 같이 Qt는 구성 : 만 종속성에 연결했던 동적으로 링크 된 빌드에

configure -c++11 -mp -static -debug-and-release -platform win32-msvc2012 -opengl desktop -opensource -confirm-license -make libs -nomake tools -nomake tests -nomake examples -no-openssl -skip webkit 

:

qtmain.lib 
Qt5Gui.lib 
Qt5Core.lib 
Qt5Widgets.lib 
Qt5Network.lib 
Qt5WinExtras.lib 
qwindows.lib 

지금은 15 라이브러리를 사용한다! 내 솔루션에 정규 표현식도 프리 타입을 사용하지 않는 경우 내 말은

qtmain.lib 
qtpcre.lib 
Qt5Gui.lib 
Qt5Core.lib 
Qt5Widgets.lib 
Qt5Network.lib 
Qt5WinExtras.lib 
opengl32.lib 
imm32.lib 
Ws2_32.lib 
Qt5PlatformSupport.lib 
qtfreetype.lib 
winmm.lib 
qtharfbuzzng.lib 
qwindows.lib 

, 왜 qtpcre, 또는 qtfreetype에 연결해야합니까? 나는 정말로 그것들 모두를 필요로합니까?

전적으로 최적화하려고했습니다.

결과에서 내 응용 프로그램 크기는 10,731KB이고 정말 실망스럽고 우울합니다. 그것을 줄일 가능성이 있습니까? 외부 응용 프로그램은 아마도?

(예, 나는 그것이 정적 빌드 그리고 그것은 7메가바이트 이하의 파일이 아닐 것이다, 그러나 어쩌면 내가 적어도 10메가바이트 아래 얻을 수 알고?)

+1

동적 라이브러리 세트에 의존합니다. 그것들은 차례로 다른 라이브러리에 의존 할 수있는 다른 동적 라이브러리에 의존합니다. 정적으로 링크하는 경우 종속성 트리의 모든 라이브러리와 링크해야합니다. 그리고 네, 실행 파일이 정말로 커질 수도 있지만 정적 링크의 트레이드 오프입니다. 그리고 메모리 요구 사항은 실제로 변하지 않을 것입니다. 모든 동적 라이브러리는 여전히로드되어야합니다. 정적으로 링크하는 것은 실제로 OS에 의해로드되어야하는 파일이기 때문에 실제로는 메모리를 절약 할 수 있습니다. –

+0

정규 표현식을 사용할 필요는 없지만, 사용하는 qt 라이브러리 함수는 정규 표현식이 필요하므로 링크되어야합니다. 정적 링크를 사용하려면 모든 간접적 인 종속성을 찾는 것이 이제 여러분의 책임입니다. 다이나믹 링커를 사용하는 경우에도 동적 링커가 모든 코드를 처리한다는 점을 제외하고는 모든 코드를 사용하고 있습니다. –

+0

또한 디버그 또는 릴리스 빌드에 표시되는 크기입니까? 실행 파일에서 디버그 및 기타 메타 데이터를 제거하려고 시도 했습니까? 속도보다는 크기를 최적화하기 위해 컴파일러 플래그를 전달 하시겠습니까? –

답변

1

크게 실행 파일의 크기가 upx

사용이라는 줄일 수있는 도구가 있습니다. 이 방법을 사용하면 추가 수동 단계를 피하기 위해 빌드 프로세스에이 도구를 추가 할 수도 있습니다.

+0

멋진 도구. 감사! :) –

1

여분의 의존성 가능성이 시스템이 동적 빌드를 도서관입니다 그렇지 않으면 동적 또는 간접적 인 종속성을로드합니다. 정적 빌드에서는 플러그인으로 사용할 수 없으며 바이너리에 포함되어야합니다.

명시 적으로 기능을 사용하지 않는다고해서 다른 사람이나 다른 사람에게 의존하지 않는 것은 아닙니다. 의존성은 그것이 직접적이든 간접적이든 관계없이 의존성이다.

10MB는 너무 초라한 것이 아니며 동적 링크 라이브러리를 배포 할 때 상당한 공간을 절약하고 있습니다. 바이너리는 필요한 모든 기능을 포함 할 것이므로 실제로 모듈을 필요로한다면이 바이너리에 대해 아무 것도 할 수 없습니다. 또한 정적 빌드는 약간 더 나은 성능 (물론 배치 편의성)을 갖습니다.

기본 컴파일러 플래그를 기억하지 못하지만 기본적으로 크기가 최적화되어 있지 않으므로 MSVC의 경우 최소 크기로 /O1을 사용하여 더 작은 바이너리를 얻을 수 있습니다. 이로 인해 약간의 성능 저하가 발생할 수 있습니다.

또한 라이브러리 수가 많을지라도 대부분이 상당히 작아서 실제로 바이너리 크기에 그다지 많은 것을 추가하지는 않습니다.

마지막으로 Qt 용 디버그 바이너리를 구축하고 싶지는 않습니다. 거대한 시간이며 낭비되는 시간이 많이 걸립니다. 동적 링크 버전을 사용하여 디버그하고 릴리스 용 정적 바이너리 만 빌드하십시오.

upx --best path/to/executable 

도) 출력을 인쇄하지 않을 -q 옵션을 추가하는 것을 고려 :