최적화 된 QT4 구축 -“./configure”플래그와 그 의미
-
05-07-2019 - |
문제
나는 최근 QT4 이익 메일 링리스트에 대한 논의가 합법적인지 상업/독점 응용 프로그램을 구축하고 QT4를 정적으로 연결하는지 여부에 대한 토론을 따랐다. 고객에게 객체 파일과 makefile 등을 제공함으로써 수행 할 수없는 방법이 있지만, 그 후에는 그런 좋은 아이디어처럼 들리지 않습니다.
내 프로젝트 중 하나는 LGPL 라이센스 QT4 라이브러리를 사용하는 것이며 모든 플랫폼에서 간단한 설치 프로그램을 사용하여 별도의 DLLS/DYLIBS/SO 's COIMSTER로 배송합니다. 이것은 지금까지 꽤 잘 작동하지만 a) 필요한 것을 포함하여 QT 라이브러리 크기를 줄임으로써 설치 프로그램의 크기를 최적화하고 싶습니다. b) 응용 프로그램의 시작/로딩 속도를 높입니다.
QT를 직접 컴파일하는 데 익숙하지만 QT에는 많은 깃발과 스위치가 있습니다.
지금은 다음 깃발로 건축하고 있습니다.
./configure \
-fast \
-opensource \
-qt-sql-sqlite \
-nomake demos examples \
-silent \
-no-qt3support \
-no-gif \
-plugin-sql-mysql \
-release \
-no-xmlpatterns \
-no-multimedia
다음 깃발이 어떤 효과/영향을 미치는지 확실하지 않습니다.
-no-stl
-no-javascript-jit
-no-nis
-separate-debug-info
-no-openvg
-no-mitshm
예를 들어 컴파일러에 대한 최적화 스위치를 제공하거나 구축 된 QT 라이브러리에서 사용되지 않은 기능을 "스트리핑"하여 더 작게 만들 수있는 다른 일이 있습니까 (정적 빌드로는 쉽게). 나는 그것에 대한 경험이 많지 않습니다.
오, 사이드 코트와 마찬가지로 QT와 동적으로 연결할 때 컴파일 된 애플리케이션 크기는 약 600KB (스트립되지 않은)입니다. 나는 그것을 실험하고 정적으로 연결할 때 크기가 약 4MB 인 것을 발견했습니다. 그러나 그렇게하면 더 이상 40MB의 QT 라이브러리를 포함 할 필요가 없습니다.
따라서 위의 모든 것을 질문/요청에 넣습니다.
이 주제에 대해 나보다 더 진보 된 경우, 자신의 애플리케이션을 최적화/배포하고 빠르게 시작하고 필요한 것만 포함하도록하는 방법은 무엇입니까?
해결책
내가 생각할 수있는 것은 몇 가지가 있습니다.
- 크기 최적화가 우수한 컴파일러/링커 조합을 사용하십시오. MSVC는 예를 들어 Mingw보다 훨씬 낫습니다. 모든 QT 릴리스 DLL은 MSVC가 ~ 21MB로 구축되었습니다. Mingw와 함께 건축 된 총은 ~ 41MB입니다. 그건 그렇고, 당신은 진짜 모든 DLL을 배송해야합니까?
- -LTCG (링크 -타임 코드 생성) 플래그를 사용하여 객체 파일을 최적화하십시오.
- QT 기능의 일부를 제외하려면 전처리 기 플래그를 사용하십시오. 예 : QT_NO_STL = -NO -STL.
- MMX/3D NOW/SSE2 플래그를 사용해보십시오
- 스타일을 제거하십시오 (-no 스타일-)
다른 팁
모든 모듈을 건너 뛰고 필요하지 않다고 생각되면 QCONFIG 도구 ($ QTDIR/ Tools/ Tree에 숨겨진)를 계속 사용하고 개별 클래스를 제거 할 수 있습니다. 의존성을 조심하십시오 - QT를 구축하기 위해 몇 번 반복해야 할 수도 있습니다 (예 : Qspinbox는 QValidator가 존재하는 것에 따라 다름).
QT, 특히 여러 번 구축 할 때 -nomake 플래그는 훌륭한 타임즈 베이비입니다. -nomake 예제 -Nomake 데모를 시도하십시오.
일반적인 속도에 대한 또 다른 최적화는 QT를 컴파일 할 때 컴파일러 최적화를 사용하는 데 있습니다. 그러나 일부 파일을 편집해야합니다. GIT에서 QT를 받으면 QTBase/ Dir로 끝납니다. 먼저 qmake를 빌드하는 구성 스크립트를 실행합니다.
메모: makefile.win32 또는 makefile.unix를 수정하고 다음과 같은 선을 추가 할 수 있습니다.
QMAKE_CXXFLAGS_RELEASE = -CompilerDependentOptimizerSwitches
QMake를 최적화하려면 QMake의 실행 시간이 중간 크기의 앱의 전체 컴파일 시간의 0.0000001% 일 수 있다는 점을 고려할 때 실제로 필요하지 않다고 생각합니다.
하지만 진짜 QT를 구축하는 데 사용되는 MKSPEC를 편집 할 때 최적화가 나옵니다.
예를 들어, VS2012가있는 Windows에서는 수정할 수 있습니다. qtbase/mkspecs/win32-msvc2012/qmake.conf
.
전. : 기본 QT5.1에서 MSVC2012 MKSPEC는 다음과 같습니다.
QMAKE_CFLAGS_RELEASE = -O2 -MD
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
크기를 최적화하려면 다음과 같이 대체 할 수 있습니다.
QMAKE_CFLAGS_RELEASE = -O1 -MD
(에 따르면 http://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx )
때로는 더 높은 수준의 MKSPEC가 포함되어 있습니다 qtbase/mkspecs/common/
멍청이
Debian/G ++ 4.8.1에서 QT5.1을 성공적으로 컴파일했습니다. -O3 -march=native
(기본값은입니다 -O2
) 누구나 서비스를 제공하는 경우.
이 작업을 수행 한 후에는 QT Git Root에서 Make를 실행하고 팀과 맥주를 마시고 좋은 컴퓨터에서도 나이가 들지 않아 (I7에서 약 2 시간, 데모 / 예제 없이는 WebKit)가 필요하기 때문입니다.
sed -i 's@QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD@QMAKE_CXXFLAGS_THREAD += $$QMAKE_CFLAGS_THREAD -march=native@g' qtbase/mkspecs/common/linux.conf
Linux에서 QT5.8을 최적화합니다