Windows 10 환경에서 Visual Studio 2015로 wxWidgets 빌드하기

wxWidgets 소개

wxWidgets는 C++ 기반의 크로스 플랫폼 GUI 라이브러리로, 개발자들이 단일 코드베이스를 사용하여 Windows, macOS, Linux 등 다양한 운영체제에서 동작하는 애플리케이션을 개발할 수 있도록 지원합니다. 파이썬, 펄, 루비 등 인기 있는 여러 언어 바인딩을 제공하며, 다른 크로스 플랫폼 툴킷과 달리 플랫폼 고유의 API를 활용하여 애플리케이션이 진정한 "네이티브" 모습을 갖도록 합니다. 또한, 광범위한 기능을 제공하고, 무료 오픈소스이며, 오랜 기간 안정적으로 사용되어 온 성숙한 프로젝트입니다.

공식 웹사이트: https://www.wxwidgets.org/

wxWidgets 소스 코드 다운로드 및 준비

먼저 wxWidgets 공식 웹사이트에서 원하는 버전의 소스 코드를 다운로드합니다. 다운로드한 압축 파일을 해제한 후, Visual Studio를 이용한 빌드를 위해 wxWidgets 소스 디렉터리 내의 build/msw 경로로 이동합니다. 예를 들어, 소스 코드를 E:\wxWidgets-3.1.2에 압축 해제했다면, E:\wxWidgets-3.1.2\build\msw가 됩니다.

Visual Studio 2015를 이용한 컴파일

  1. Visual Studio 2015를 실행하고, 앞서 언급된 build/msw 디렉터리에 있는 wx_vc14.sln 파일을 엽니다.
  2. 솔루션 탐색기에서 모든 프로젝트를 선택하거나 개별 프로젝트의 속성을 열고 "C/C++" > "코드 생성" 섹션으로 이동합니다. "런타임 라이브러리" 옵션을 "다중 스레드(/MT)" 또는 "다중 스레드 디버그(/MTd)"로 설정하여 정적 런타임 라이브러리 링크를 사용하도록 구성합니다.
  3. 솔루션을 빌드합니다. 이 과정에서 wxWidgets 라이브러리 파일(.lib)들이 지정된 출력 디렉터리에 생성됩니다. 일반적으로 20개 이상의 라이브러리 파일이 생성됩니다.

프로젝트 설정 및 라이브러리 링크

wxWidgets를 사용하는 사용자 프로젝트에서 다음 설정들을 구성해야 합니다.

  1. 포함 디렉터리 (Include Directories) 설정:
    wxWidgets 소스 루트 디렉터리에 있는 include 폴더를 프로젝트의 추가 포함 디렉터리에 추가합니다. 예를 들어, E:\wxWidgets-3.1.2\include가 됩니다.
  2. 라이브러리 디렉터리 (Library Directories) 설정:
    빌드 과정에서 생성된 라이브러리 파일들이 위치한 경로를 프로젝트의 추가 라이브러리 디렉터리에 추가합니다. 예를 들어, E:\wxWidgets-3.1.2\lib\vc_x64_lib\mswu (64비트 유니코드 빌드 기준)가 됩니다.
  3. setup.h 파일 복사:
    빌드된 라이브러리 경로(예: E:\wxWidgets-3.1.2\lib\vc_x64_lib\mswu\wx)에 있는 setup.h 파일을 E:\wxWidgets-3.1.2\include\wx 디렉터리로 복사합니다. 이 파일은 wxWidgets 컴파일 옵션에 따라 달라지는 중요한 설정 정보를 담고 있습니다.
  4. 추가 종속성 (Additional Dependencies) 설정:
    프로젝트 속성에서 "링커" > "입력" 섹션으로 이동하여 다음 라이브러리 파일들을 "추가 종속성"에 추가합니다. 이 목록은 wxWidgets의 특정 버전 및 빌드 설정에 따라 약간 달라질 수 있습니다.

필수 라이브러리 목록

wxbase31u.lib
wxbase31u_net.lib
wxbase31u_xml.lib
wxexpat.lib
wxjpeg.lib
wxmsw31u_adv.lib
wxmsw31u_aui.lib
wxmsw31u_core.lib
wxmsw31u_gl.lib
wxmsw31u_html.lib
wxmsw31u_media.lib
wxmsw31u_propgrid.lib
wxmsw31u_qa.lib
wxmsw31u_ribbon.lib
wxmsw31u_richtext.lib
wxmsw31u_stc.lib
wxmsw31u_webview.lib
wxmsw31u_xrc.lib
wxpng.lib
wxregexu.lib
wxscintilla.lib
wxtiff.lib
wxzlib.lib
winmm.lib
comctl32.lib
rpcrt4.lib
wsock32.lib
wininet.lib

간단한 "Hello World" 애플리케이션 예제

모든 설정이 완료되면, wxWidgets를 사용하여 간단한 GUI 애플리케이션을 작성하고 빌드할 수 있습니다. 다음은 기본적인 "Hello World" 메시지를 표시하는 애플리케이션 코드입니다.

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

// 애플리케이션 클래스 정의
class SimpleApp : public wxApp
{
public:
    virtual bool OnInit();
};

// 메인 프레임 클래스 정의
class MainFrame : public wxFrame
{
public:
    MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size);

private:
    void OnShowMessage(wxCommandEvent& event);
    void OnTerminate(wxCommandEvent& event);
    void OnDisplayAbout(wxCommandEvent& event);

    enum
    {
        CMD_SHOW_MESSAGE = 1001
    };

    wxDECLARE_EVENT_TABLE();
};

// 이벤트 테이블 구현
wxBEGIN_EVENT_TABLE(MainFrame, wxFrame)
    EVT_MENU(MainFrame::CMD_SHOW_MESSAGE, MainFrame::OnShowMessage)
    EVT_MENU(wxID_EXIT, MainFrame::OnTerminate)
    EVT_MENU(wxID_ABOUT, MainFrame::OnDisplayAbout)
wxEND_EVENT_TABLE()

// 애플리케이션 구현 매크로
wxIMPLEMENT_APP(SimpleApp);

// 애플리케이션 초기화
bool SimpleApp::OnInit()
{
    MainFrame *appFrame = new MainFrame("Welcome to wxWidgets Demo", wxPoint(100, 100), wxSize(500, 380));
    appFrame->Show(true);
    return true;
}

// 메인 프레임 생성자
MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
    : wxFrame(NULL, wxID_ANY, title, pos, size)
{
    // 메뉴 바 생성
    wxMenu *fileMenu = new wxMenu;
    fileMenu->Append(CMD_SHOW_MESSAGE, "Show &Message...\tCtrl-M", "Display a simple message");
    fileMenu->AppendSeparator();
    fileMenu->Append(wxID_EXIT, "E&xit\tAlt-F4", "Quit this application");

    wxMenu *helpMenu = new wxMenu;
    helpMenu->Append(wxID_ABOUT, "&About...\tF1", "About this application");

    wxMenuBar *mainMenuBar = new wxMenuBar;
    mainMenuBar->Append(fileMenu, "&File");
    mainMenuBar->Append(helpMenu, "&Help");
    SetMenuBar(mainMenuBar);

    // 상태 바 생성
    CreateStatusBar();
    SetStatusText("Ready for action!");
}

// 종료 이벤트 핸들러
void MainFrame::OnTerminate(wxCommandEvent& event)
{
    Close(true);
}

// 정보 이벤트 핸들러
void MainFrame::OnDisplayAbout(wxCommandEvent& event)
{
    wxMessageBox("This is a basic wxWidgets demonstration application.",
                 "About Demo App", wxOK | wxICON_INFORMATION);
}

// 메시지 표시 이벤트 핸들러
void MainFrame::OnShowMessage(wxCommandEvent& event)
{
    wxLogMessage("Hello, wxWidgets world!");
}

태그: wxWidgets C++ Visual Studio 2015 Windows GUI development

7월 24일 09:56에 게시됨