スポンサーリンク

libファイルを一つにまとめる

wxWidgetsを使用するときに、.libファイルを大量にリンクしなければならない。この問題を解決するために、無数にある.libファイルを一つのファイルにまとめてしまうことができる。

まず、以下のようにmulti-lib/ フォルダ内にwxWidgetsの.libファイルが入っているとする。

D:.
└─multi-lib/
        wxbase33u.lib
        wxbase33u_net.lib
        wxbase33u_xml.lib
        wxexpat.lib
        wxjpeg.lib
        wxlexilla.lib
        wxmsw33u_adv.lib
        wxmsw33u_aui.lib
        wxmsw33u_core.lib
        wxmsw33u_gl.lib
        wxmsw33u_html.lib
        wxmsw33u_media.lib
        wxmsw33u_propgrid.lib
        wxmsw33u_qa.lib
        wxmsw33u_ribbon.lib
        wxmsw33u_richtext.lib
        wxmsw33u_stc.lib
        wxmsw33u_webview.lib
        wxmsw33u_xrc.lib
        wxpng.lib
        wxregexu.lib
        wxscintilla.lib
        wxtiff.lib
        wxzlib.lib

複数のライブラリを一つにまとめるには、lib.exeを使用する。

lib.exe /OUT:纏めたファイル名.lib ライブラリ1.lib ライブラリ2.lib

まず、 x64 Native Tools Command Prompt for VS 2022 を開いて、Visual Studioのツールを使えるようにする。

そして、以下のように入力してcombined_wx.libを作成する。カレントディレクトリに出力されるので、この例だとmulti-lib/combined_wx.libが作成される。

> cd multi-lib
> lib.exe /OUT:combined_wx.lib *.lib

 

使用例

特に注意するところはない。普通に使用できる。

// プリプロセッサに以下を追加
// __WXMSW__

// static link library の場合、以下は指定しない
// WXUSINGDLL

// サブシステムをWindowsに設定(WinMainで呼び出すので)
// Windows (/SUBSYSTEM:WINDOWS)

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

#include <wx/gdicmn.h> // wxPointに必要
#include <wx/frame.h>  // wxFrameに必要

// Win32 API
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "rpcrt4.lib")

#if 1

// 一つに纏めた.libファイル群
#pragma comment(lib,"combined_wx.lib")

#else
// 本来使用する.libファイル群
#pragma comment(lib,"wxmsw33u_core.lib")
#pragma comment(lib,"wxbase33u.lib")
#pragma comment(lib,"wxbase33u_net.lib")
#pragma comment(lib,"wxbase33u_xml.lib")
#pragma comment(lib,"wxexpat.lib")
#pragma comment(lib,"wxjpeg.lib")
#pragma comment(lib,"wxlexilla.lib")
#pragma comment(lib,"wxmsw33u_adv.lib")
#pragma comment(lib,"wxmsw33u_aui.lib")
#pragma comment(lib,"wxmsw33u_gl.lib")
#pragma comment(lib,"wxmsw33u_html.lib")
#pragma comment(lib,"wxmsw33u_media.lib")
#pragma comment(lib,"wxmsw33u_propgrid.lib")
#pragma comment(lib,"wxmsw33u_qa.lib")
#pragma comment(lib,"wxmsw33u_ribbon.lib")
#pragma comment(lib,"wxmsw33u_richtext.lib")
#pragma comment(lib,"wxmsw33u_stc.lib")
#pragma comment(lib,"wxmsw33u_webview.lib")
#pragma comment(lib,"wxmsw33u_xrc.lib")
#pragma comment(lib,"wxpng.lib")
#pragma comment(lib,"wxregexu.lib")
#pragma comment(lib,"wxscintilla.lib")
#pragma comment(lib,"wxtiff.lib")
#pragma comment(lib,"wxzlib.lib")

#endif

/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

// ウィンドウ作成
class MyFrame : public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
    {
    }

private:

    // イベント処理しないときはこれを入れない
    // wxDECLARE_EVENT_TABLE();
};

/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

// wxWidgetsのアプリケーション作成
class MyApp : public wxApp {
public:

    virtual bool OnInit() {
        MyFrame* frame = new MyFrame("Hello World", wxPoint(50, 50), wxSize(450, 340));
        frame->Show(true);
        return true;
    }

};

/////////////////////////////////////
/////////////////////////////////////
/////////////////////////////////////

// WinMainをマクロで定義
wxIMPLEMENT_APP(MyApp);

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: