취미생활/프로그래밍

C++/MFC 자주 발생하는 에러 & 해결법

내가그리는인생 2025. 7. 9. 12:20
반응형

LNK2005, LPCTSTR 변환, 매니페스트 권한 오류 등 C++/MFC 개발 중 발생하는 주요 에러를 한 번에 해결할 수 있는 실전 가이드입니다.

1. fatal error LNK2005 – 중복 정의(링커 오류) 해결법

원인: 헤더에 함수/변수를 정의하고, 여러 cpp에서 동일하게 포함하여 링커가 중복 심볼을 찾음.
해결법:

  1. const 변수 등은 헤더에서 정의하지 않고 extern 선언만 사용.
  2. 링커 옵션에 /FORCE:MULTIPLE을 추가해 중복 정의를 무시하도록 설정.

관련 사례:

팀 경험 팁:

  • 여러 개발자가 유틸리티 헤더를 공용으로 쓸 때 중복 정의 주의. 팀 코드 리뷰에서 #pragma onceextern 키워드 사용 여부 확인 필요.

2. fatal error LNK1561 – Entry Point(진입점) 누락

원인: main() 혹은 WinMain() 함수가 없거나 링커 설정 불일치.
해결법:

  • 프로젝트 속성 → 링커 → 고급 → Entry Point에 mainCRTStartup 또는 WinMainCRTStartup 지정

관련 사례:

  • 콘솔 앱을 만들었지만 Win32 프로젝트로 설정되어 있으면 이 에러 발생 가능.
  • Visual Studio의 새로운 프로젝트 마법사에서 /SUBSYSTEM 설정이 자동으로 잘못 설정될 때 자주 나타남.

팀 경험 팁:

  • 프로젝트 템플릿을 사용할 때, 입출력 방식(Console vs Windows GUI)을 확실히 명시하고 소스 코드 기본 구조를 점검하는 습관이 중요.

3. “LPCTSTR에서 const char *로 변환할 수 없습니다” – 유니코드 관련 오류

원인: MFC 기본 문자셋이 유니코드이고, const char*와 호환되지 않아 발생.
해결법:

  • 프로젝트 속성 → 구성 속성 → 일반 → 문자 집합 → “멀티바이트 문자 집합”으로 변경

관련 사례:

  • 문자열 리터럴에서 "문자열" 대신 _T("문자열") 사용 필요.
  • CStringstd::string 간의 변환 시 타입 충돌 문제 다수 보고됨.

팀 경험 팁:

  • 신입 개발자들은 TCHAR, LPCTSTR, CString, std::string 등 다양한 문자열 타입을 혼용하다 컴파일 오류에 직면함. 공통 코드 스타일 가이드에 문자열 처리 방식 명시 필요.

4. 매니페스트 파일 오류 – 관리자 권한 문제

원인: 실행 시 매니페스트 요구로 인해 권한 부족 발생 가능성.
해결법:

  • Visual Studio와 Windows SDK를 최신 버전으로 업데이트 후, 문제가 지속되면 VS 재설치 권장
  • app.manifest에서 <requestedExecutionLevel>asInvoker 또는 requireAdministrator로 조정

관련 사례:

  • UAC(사용자 계정 컨트롤) 설정이 켜진 상태에서 requireAdministrator로 설정되었지만 실제 실행은 표준 권한으로 시도될 때 충돌 발생.

팀 경험 팁:

  • 배포 전 테스트 환경에서 관리자 권한 요구 여부를 명확히 체크. QA 단계에서 사용자 권한별 시나리오를 고려해 테스트 필요.

5. “코드 요소가 읽기 전용입니다…” – 자동화 코드 삽입 장애

원인: .NCB 캐시가 손상되어 다이얼로그 클래스 자동 생성이 막힘.
해결법:

  • 프로젝트 폴더에서 .NCB, .VC.db, .sdf 파일을 삭제하고 Visual Studio 재시작

관련 사례:

  • ClassWizard 또는 리소스 에디터로 생성한 핸들러 코드가 삽입되지 않음.

팀 경험 팁:

  • 대용량 솔루션에서는 NCB 손상이 빈번하게 발생. Visual Studio를 관리자 권한으로 실행하고, 정기적으로 솔루션 정리 및 재빌드 습관화 필요.

6. MFC CFile 사용법 – 파일 입출력 핵심 정리

주요 클래스 기능:

  • 생성자: CFile(filename, flags) – 모드 지정 가능
  • Open, Read, Write – 파일 열기, 읽기, 쓰기
  • Seek, SeekToEnd, GetLength, SetLength – 위치 조정 및 크기 제어
  • Close – 파일 닫기 (소멸자에서 자동 닫힘)

관련 사례:

  • CFile::Open 호출 시 경로가 상대 경로인지 절대 경로인지에 따라 파일 열기 실패 빈번
  • CFileException 처리를 생략하여 디버깅 어려움 초래

팀 경험 팁:

  • 파일 작업 시 CFileException을 적극 활용하고, 로그 파일 또는 백업 파일을 생성해 디버깅 및 사용자 피드백에 활용 가능하도록 구현할 것.

현재는 개발툴이 업데이트 되어 없어졌을 수도 있으나 과거 사례를 다시 찾아 정리해 봅니다.

반응형