본문 바로가기
프로그래밍/MFC

MFC에서 여러 라이브러리를 사용하기 위한 CMake 방법

by 남생 namsaeng 2022. 3. 26.
반응형

MFC 상에서 Git Hub에 올려있는 여러 라이브러리를 함께 사용하려고 할 때 발생하는 문제점을 해결할 수 있는 방법을 소개한다.

 

CMake GUI를 이용한 방법이기 때문에 아래 포스팅에서 사용한 코드를 가지고 진행했다.

 

https://namsaenga.tistory.com/25

 

Windows MFC에서 Redis Client 이용하기

데이터 수집, 가공, 처리와 관련된 응용프로그램을 개발할 때 C++ 언어를 사용하는 윈도 응용프로그램 개발 프레임워크인 MFC(Microsoft Foundatin Class Library)를 이용할 경우가 있다. 여러 이유가 있겠

namsaenga.tistory.com

 


 

[문제 1]

  • 예제로 작성했던 redis 코드(x64)를 기존 프로그램(x86)에 통합할 때 [LNK4272 : ‘x86’ 라이브러리 컴퓨터 종류가 ‘x64’ 대상 컴퓨터 종류와 충돌합니다.] 경고 및 여러 오류가 나타났다.

 

LNK4272 오류

 

[문제 2]

  • 문제 1을 해결하기 위하여, CMake GUI로 Win32 빌드 프로그램 생성 및 Win32 프로젝트 빌드를 수행한 후, 다시 기존 프로그램과 통합 및 빌드를 수행하면 다음과 같은 오류가 발생한다.

 

a. [오류 1]

  • MDd 런타임 라이브러리로 속성이 맞춰진 프로젝트에 Mtd 런타임 라이브러리를 사용하려고 할 때 발생하는 문제이다.

프로젝트 런타임 라이브러리 충돌

 

b. [오류 2]

  • _AFxDLL 빌드를 위해 [프로젝트 속성] > [구성 속성] > [C/C++] > [코드 생성] > [런타임 라이브러리] > [다중 스레드 DLL(/MD)]로 변경하라는 말이다.
  • 다중 스레드 DLL(/MD)로 변경하고 다시 빌드를 하면 오류 1 현상이 또 나타난다.

프로젝트 속성을 /Mtd로 바꿨을 때

 

 

* 위의 두 오류를 해결하기 위해 프로젝트 속성을 계속 변경했지만 계속 비슷한 오류가 반복되었다. 각 프로그램의 프로젝트 속성을 고려한 Win32 빌드 프로그램 생성 및 Win32 프로젝트 빌드를 수행했더니 문제가 해결되었다.

 

 

 


 

<프로젝트 속성>

 

redis 코드(x64)

- MFC 사용 : 공유 DLL에서 MFC 사용

- 런타임 라이브러리 : 다중 스레드 디버그 DLL(/MDd)

 

기존 프로그램(Win32)

- MFC 사용 : 정적 라이브러리에서 MFC 사용

- 런타임 라이브러리 : 다중 스레드 디버그(/MTd)

 

 

<해결방법>

 

1. tacopie.sln 빌드

  • tacopie.sln을 열어 [프로젝트 속성] > [구성 관리자] > [플랫폼] > [Win32]로 설정한다.
  • [프로젝트 속성] > [구성 속성] > [고급] > [MFC 사용] > [표준 Windows 라이브러리 사용]을 [정적 라이브러리에서 MFC 사용]으로 변경한다.
  • [프로젝트 속성] > [구성 속성] > [C/C++] > [코드 생성] > [런타임 라이브러리] > [다중 스레드 디버그(/MTd)]로 변경한다.
  • tacopie 프로젝트를 빌드한다.

 

2. CMake GUI 설정

  • CMake GUI를 관리자 권한으로 실행한 후에 [Where is the source code] 및 [Where to build the binaries] 경로를 설정하고 [Configure] > [Optional Platform for Generator] > [Win32]로 설정한 후에 나머지 값들을 설정한다. 참고로 나의 설정 값은 아래와 같다. 설정이 끝났으면 [Generate] > [Open Project]를 선택한다.
항목 경로
[Where is the source code] C:\Users\SIU\Downloads\cpp_redis-master\cpp_redis-master
[Where to build the binaries] C:\Users\SIU\Downloads\cpp_redis-master\cpp_redis-master\build
[CMAKE_CONFIGURATION_TYPES] Debug;Release;MinSizeRel;RelWithDebInfo
[CMAKE_INSTALL_PREFIX] C:\Users\SIU\Desktop\temp\cpp_redis
[TACOPIE_INCLUDE_DIR] C:\Users\SIU\Downloads\tacopie\tacopie\includes
[TACOPIE_LIBRARY]
C:\Users\SIU\Downloads\tacopie\tacopie\msvc15\Win32\Debug\tacopie.lib

 

 

3. cpp_redis.sln 빌드

  • CMake GUI에서 [Open Project]를 선택하면 아래 경로의 솔루션이 열린다.
    C:\Users\SIU\Downloads\cpp_redis-master\cpp_redis-master\build\cpp_redis.sln

 

1) ALL_BUILD 프로젝트 속성 변경 후 빌드

 

  • [ALL_BUILD 속성 페이지] > [구성 속성] > [고급] > [기본 설정 빌드 도구 아키텍처] > [64비트(x64)]를 [32비트(x86)]으로 바꿔준다
  • [ALL_BUILD 속성 페이지] > [구성 속성] > [고급] > [MFC 사용] > [표준 Windows 라이브러리 사용]을 [정적 라이브러리에서 MFC 사용]으로 바꿔준다.
  • 두 가지 속성 값을 변경하였으면 프로젝트 빌드를 해준다.

ALL_BUILD 속성 페이지

 

 

2) INSTALL 프로젝트 속성 변경 후 빌드

  • ALL_BUILD 프로젝트와 같은 방법으로 속성 값을 바꾼 후에 빌드한다.

 

 

* 결론: MFC 상에서 서로 다른 라이브러리를 통합하여 사용할 경우에는 “플랫폼”이 x86인지 x64인지 뿐만 아니라 “MFC 사용” 및 “런타임 라이브러리” 종류도 일치하게 환경을 구성해줘야 하는 것을 깨달았다.

 

 

 

 

반응형

'프로그래밍 > MFC' 카테고리의 다른 글

x86 MFC에서 PostgreSQL 사용하기  (0) 2022.04.03
MFC에서 TimescaleDB 사용하기  (0) 2022.04.03

댓글