들어가며
임베디드 개발을 하다 보면 레거시가 되어버린 Qt 4.8 또는 Qt 5 기반 개발 환경을 비교적 쉽게 접하게 된다.
나 역시 임베디드 크로스 컴파일 환경에서 Qt 4.8과 Qt 5, Qt 6을 모두 사용해 왔고,
그 과정에서 체감한 버전별 차이와 주의할 점을 정리해 보고자 한다.
우리 회사는 Qt Framework를 사용하는 제조업 기반 HMI 회사로,
임베디드 장비에는 ARM Cortex-A architecture CPU를 사용한다.
· Embedded Device : Ubuntu 18.04 + Qt4.8
· Linux PC용 SW : Ubuntu 22.04 + Qt5
이처럼 서로 다른 환경을 동시에 다루며 겪었던 경험을 중심으로 글을 써보려 한다.
Qt 4.8을 사용하며 느낀 점
Qt 4.8.7은 2015년 12월을 마지막으로 공식지원이 종료된 버전이다.
이로 인해 비교적 최신 배포판인 Ubuntu 22.04 이상 환경에서는 다양한 충돌이 발생한다.
나 역시 다음과 같은 문제들을 겪었다.
- GUI 라이브러리 설치 충돌
- OpenSSL / SSH 버전 차이로 인한 빌드 문제
- 패키지 의존성 문제
이러한 이유로 Qt 4 기반 레거시 프로젝트를 유지해야 한다면 ubuntu 18.04 이하 환경을 사용하는 것을 권장한다.
Qt 4 개발 시 주의할 점
1. Signal / Slot 문법 차이
// Qt4 old style.
connect(sender, SIGNAL(signalName(Type)), receiver, SLOT(slotName(Type)));
// Qt5 new style.
connect(sender, &Sender::signalName, receiver, &Receiver::slotName);
Qt 5부터는 New Signal Slot Syntax가 도입되었다.
이 방식은 컴파일 타임에 타입 체크가 가능해 훨씬 안전하다.
반면 Qt 4의 old-style 문법은
컴파일 타임에 타입체크가 이루어지지 않고, 런타임시 연결 오류가 발생할 수 있다는 차이점이 있다.
또한 Qt 4 에서는 함수 포인터와 람다 표현식을 사용할 수 없다.
따라서 일회성이나 단순한 처리라도 반드시 SLOT 함수를 선언·정의해야 하며,
이는 코드량 증가와 유지보수 비용으로 이어진다.
따라서 레거시 프로그램의 경우 Qt4에서도 빌드되어야 하는지 여부는 설계 단계에서 반드시 확인해야 한다.
2. JSON Libarary 공식 미지원
Qt 4에는 QJson이 기본 라이브러리로 포함되어 있지 않다.
외부 JSON 라이브러리를 추가하거나 직접 파싱하는 방식도 가능하지만,
임베디드 장치에 Qt4로 개발한 레거시 프로그램이 돌고 있다면 다음 리스크를 고려해야 한다.
- JSON 파싱에 따른 CPU 부하
- 동적 메모리 사용 시 fragmentation 위험
- 타 프로그램과의 연동 및 유지보수 관점
결과적으로 나는 JSON Frame-based 프로토콜로 구현한 경험이 있다.
반대로 Qt 5 이상을 사용할 수 있는 환경이라면 공식 라이브러리를 적극 활용하길 권장한다.

3. qmake, CMake 지원 차이

Qt 4 프로젝트는 사실상 qmake 사용이 강제된다.
qmake란 Qt 전용 Makefile 생성기로, Qt 4 프로젝트의 경우 표준 빌드 시스템이다.
Qt 5부터는 CMake를 공식 지원하기 시작했고,
최근 Qt 그룹의 동향은 qmake를 버리고 CMake로 전환하는 추세이다.
Qt 4 프로젝트 분석을 위해서는 qmake 문법을 필수적으로 알아야 하며,
Qt 5, Qt 6에서 변경된 qmake 문법도 고려해야 한다.
만약 현재 개발 중인 프로젝트가 qmake 기반이라면,
장기적으로는 CMake 빌드 시스템으로 전환하는 것을 추천한다.
회고
몇 달간 Qt 4 기반 레거시 환경을 분석하고,
동시에 Qt 5 기반 신규 프로젝트를 진행하면서 두 환경의 차이를 체감할 수 있었다.
특히 작년 Qt Conference에 참석하며
Qt의 빌드 시스템 전환 흐름(CMake 중심)을 이해했고,
임베디드 크로스 컴파일 환경을 직접 구성하며 실력이 크게 늘었음을 느낀다.
앞으로도 단순히 기능 구현에 그치지 않고,
환경·도구·아키텍처까지 함께 고민하며 경험을 쌓아 지속적으로 성장해야겠다고 생각했다.
'Qt' 카테고리의 다른 글
| Qt IPC 성능 비교 실험기 ㅡ QSharedMemory, QLocalSocket, QTcpSocket, QRemoteObject (1) | 2026.01.19 |
|---|---|
| Qt6 DLL 생성부터 gtest 유닛 테스트까지 ㅡ 프로젝트 구성 따라하기 (0) | 2026.01.14 |
| Qt에서 시간 다루기: Unix Time, TimeZone, Embedded Device의 시간 전송 (0) | 2025.12.19 |
| Qt Signal/Slot과 Multi-Thread 동작 원리 - invokeMethod로 겪은 문제와 올바른 함수 설계 (0) | 2025.12.08 |
| QLibrary DLL 로드 실패 원인 분석기 — ‘지정된 모듈을 찾을 수 없습니다’ 해결기 (0) | 2025.11.11 |