개발 중인 프로젝트에 QLibrary를 이용하며 기존에 없던 버그를 만났다.
OPC UA Server를 실행하기 위해 "McdOpcUaServer.dll" 을 QLibrary를 통해 동적으로 로드하려 했다.
QString fileName = SystemPath::driverLocation() + "/" + m_libFileName;
QLibrary m_lib;
m_lib.setFileName(fileName);
const bool loaded = m_lib.load();
if(!loaded) {
qDebug() << m_lib.errorString();
}
별거 없는 코드에 아래와 로드가 실패하고 다음과 같이 출력된다.
"라이브러리 C:\\Minerva\\trunk\\MinervaX\\bin\\i686-w64-mingw32_8.1.0\\drivers\\McdOpcUaServer.dll을(를) 불러올 수 없음: 지정된 모듈을 찾을 수 없습니다."
원인은 경로에 McdOpcUaServer.dll 파일은 있지 의존성이 있는 다른 dll파일을 못찾는 것.
더 큰 문제는 McdOpcUaServer.dll 에 어떤 의존성이 걸려있는지 모른다는 것이다.
해결 실패. Dependencies 프로그램을 사용해 dll 의존성 확인

Dependencies 프로그램에 dll 파일을 끌고와 필요한 dll을 찾을 수 있었다.
해당 dll들을 McdOpcUaServer.dll 경로에 같이 복사해 준 뒤 실행했지만, 여전히 dll 로드에 실패했다.
해결. 프로세스 모니터 Procmon 을 이용한 dll 로드 절차 점검
한참 고민하다 Procmon이라는 툴로 프로세스가 실행중일때 로그를 볼 수 있는 툴이 있다는걸 알았다.

Procmon은 모든 프로세스의 로그를 보여주기 때문에
dll에 관련된 로그만 나오도로 적당한 Filter를 걸어주고 load() 코드를 실행했다.

그러면 프로세스가 dll을 불러오며 실행하는 동작들을 CreateFile과 Result로 확인할 수 있는데,
하나씩 살펴보면 다른 dll들은 다른 폴더에서라도 한번씩 SUCCESS가 되는데, libuamodule.dll 은 NAME NOT FOUND 만 있는걸 알 수 있다.
TIP! 로그를 싹다 복사해 ChatGPT한테 찾으라 하면 바로 찾아준다.
해당 경로로 들어가보니 libuamodule.dll 파일이 없었고 thirdpary 빌드설정에 uamodule이 누락된걸 수정해 해결했다.
+ 아마도 libuamodels와 햇갈려 누락한것 같아보임
회고.
- 프로세스 실행 중 동적으로 디버깅이 필요할 때, Process Monitor를 사용하면 종종 빠르게 해결할 수 있을것 같다.
- 최근 googleTest에 관심을 가지고 있다. dll 프로젝트에도 lib로드 test와 함수실행 test코드가 있었다면
lib사용 시점이 아닌, 테스트를 통해 바로 찾을 수 있었을 것이다. - 추가로 발견한 문제로 dll 들을 이상한 경로에서 로드하려다 실패하는 경우를 발견했는데, thirdparty로 나눠지기 전 경로로 load를 시도하는 경우가 있는것 같다. 코드 정리 task 에 추가할 수 있게 됐다.
'Qt' 카테고리의 다른 글
| Qt IPC 성능 비교 실험기 ㅡ QSharedMemory, QLocalSocket, QTcpSocket, QRemoteObject (1) | 2026.01.19 |
|---|---|
| Qt6 DLL 생성부터 gtest 유닛 테스트까지 ㅡ 프로젝트 구성 따라하기 (0) | 2026.01.14 |
| Qt 4 · Qt 5 · Qt 6 차이점 정리 — 레거시 컴파일 실무 경험 (0) | 2026.01.07 |
| Qt에서 시간 다루기: Unix Time, TimeZone, Embedded Device의 시간 전송 (0) | 2025.12.19 |
| Qt Signal/Slot과 Multi-Thread 동작 원리 - invokeMethod로 겪은 문제와 올바른 함수 설계 (0) | 2025.12.08 |