Win32 GUI Generics 1.6.3(2)

公開:2005-01-24 12:01
更新:2020-02-15 04:36
カテゴリ:c++

以前、ライブラリ自体をUNICODEでビルドするとエラーが出まくるので、仕方なくライブラリのソースファイルに手をいれました。今回バージョンもUNICODEでビルドを通すように修正しなくては!と思いました。
しかし、ライブラリを利用するだけならそもそもそんなことしなくてもいいのではないかと思い、ライブラリについているサンプルのみをUNICODEでビルドしてみたところ、下記のエラーが出ます。

sample_dlg.obj : error LNK2019: 未解決の外部シンボル "public: thiscall win32::gui::dialog::dialog(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,enum win32::gui::dialog::create_subdialogs_type)" (??0dialog@gui@win32@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@W4create_subdialogs_type@012@@Z) が関数 "public: thiscall win32::gui::detail::derive_from_base<struct win32::gui::dialog,0>::derive_from_base<struct win32::gui::dialog,0>(void)" (??0?$derive_from_base@Udialog@gui@win32@@$0A@@detail@gui@win32@@QAE@XZ) で参照されました。
Debug/sample_start.exe : fatal error LNK1120: 外部参照 1 が未解決です。

メンバテンプレートのインスタンス化に関するエラーのようですね。
おそらくライブラリはマルチバイトでコンパイルしているためにbasic_stringのchar traitsはcharとなり、UNICODEバージョンのbasic_stringのインスタンス化されたobjがライブラリ側で生成されないためでしょう。

回避策としては、

・ライブラリをstatic linkするのをやめ、ソースも含めてプロジェクトをビルドする
・ライブラリをUNICODEでビルドしなおす(いままでどおり?)

ということが考えられます。
どっちが簡単なのか悩んでいるところです。