トップページ > 記事閲覧
unknown type name 'IUnknown'
名前:yumetodo 日時: 2016/08/04 22:15

いつの間にやらMicrosoft Visual Studio 2015 Clang with Microsoft CodeGenもclangのバージョンが3.8になり(5月の更新)、 プラットフォームツールセットの名前が Clang 3.7 with Microsoft CodeGen (v140_clang_3_7)からVisual Studio 2015 - Clang with Microsoft CodeGen (v140_clang_c2) に変更になったりしていますが(7月の更新)、先日の7月版の更新で、 1> In file included from C:\Program Files (x86)\Windows Kits\8.1\Include\um\windows.h:210: 1> In file included from C:\Program Files (x86)\Windows Kits\8.1\Include\um\ole2.h:32: 1> In file included from C:\Program Files (x86)\Windows Kits\8.1\Include\um\objbase.h:27: 1>C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown' 1> static_cast<IUnknown*>(*pp); // make sure everyone derives from IUnknown のようなエラーが出るようになりました。 解決策としてはWindwos.hをincludeしている箇所すべてを #if !defined(CINTERFACE) && defined(__c2__) && __clang_major__ == 3 && __clang_minor__ == 8 //To avoid compile error //C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown' // static_cast<IUnknown*>(*pp); // make sure everyone derives from IUnknown #define CINTERFACE #endif #include <Windows.h> のように置き換えることです。 副作用としてはCOM周りの定義が吹っ飛びますが、DxLib.hを呼ぶぶんには特に支障は見たりませんでした(ライブラリビルド時は知りません) DxLib側で対応していただけないでしょうか? https://github.com/Nagarei/DxLibEx/issues/84
メンテ

Page: 1 |

Re: unknown type name 'IUnknown' ( No.1 )
名前:管理人 日時:2016/08/07 04:42

とりあえず Windows.h をインクルードしている箇所について全て #if !defined(CINTERFACE) && defined(__c2__) && __clang_major__ == 3 && __clang_minor__ == 8 //To avoid compile error //C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown' // static_cast<IUnknown*>(*pp); // make sure everyone derives from IUnknown #define CINTERFACE #endif #include <Windows.h> という記述にしてみましたので、よろしければお試しください m(_ _)m ( 因みに Microsoft Visual Studio 2015 Clang with Microsoft CodeGen でのライブラリのビルドは試していません ) https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース
メンテ
Re: unknown type name 'IUnknown' ( No.2 )
名前:yumetodo_(解決) 日時:2016/08/10 15:16

ありがとうございます。うまくいきました。 ちなみにライブラリのビルドはどうなんだろうと思ったら、やっぱりClang with Microsoft CodeGenでは無理ですね。 具体的には、DX_NON_INLINE_ASMのDefineは必須として、 ./Windows/DxUseCStrmBaseFilter.h がほぼ全滅します。あとenumで64bit整数を使うための typedef enum tagD_XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER { //略 D_XAUDIO2_ANY_PROCESSOR = 0xffffffff, } D_XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, D_XAUDIO2_PROCESSOR ; みたいな書き方もclangでは許容されないので(int型への縮小変換になる) #include <cstdint> typedef enum tagD_XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER : std::uint64_t { //略 D_XAUDIO2_ANY_PROCESSOR = 0xffffffff, } D_XAUDIO2_WINDOWS_PROCESSOR_SPECIFIER, D_XAUDIO2_PROCESSOR ; のように基底型を明示しないといけませんし。
メンテ
Re: unknown type name 'IUnknown' ( No.3 )
名前:yumetodo(ReOpen) 日時:2016/12/15 13:14

その後clang with Microsoft CodeGenにも更新があり、この問題が修正されたようです。 DxCompileConfig.hの一番上に struct IUnknown; #include <Unknwnbase.h> と記載し、DX_NON_INLINE_ASMを定義することで、DxDrawFuncMake、DxLibMakeともにコンパイルが通りました。 先の変更をrevertし、IUnknownを前方宣言するように書き換えていただければ幸いです
メンテ
Re: unknown type name 'IUnknown' ( No.4 )
名前:yumetodo(ReOpen) 日時:2016/12/15 13:48

>#include <Unknwnbase.h> は多分先の変更をrevertすればいらないはず・・・
メンテ
Re: unknown type name 'IUnknown' ( No.5 )
名前:Nagerei(Nameless) 日時:2016/12/15 14:14

確認したところ、 #if !defined(CINTERFACE) && defined(__c2__) && __clang_major__ == 3 && __clang_minor__ == 8 //To avoid compile error //C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown' // static_cast<IUnknown*>(*pp); // make sure everyone derives from IUnknown #define CINTERFACE #endif を #if defined(__c2__) && __clang_major__ == 3 && __clang_minor__ == 8 //To avoid compile error //C:\Program Files (x86)\Windows Kits\8.1\Include\um\combaseapi.h(229,21): error : unknown type name 'IUnknown' // static_cast<IUnknown*>(*pp); // make sure everyone derives from IUnknown struct IUnknown; #endif に置き換えることでコンパイル出来ました。 (DxCompileConfig.hを変更する必要はありませんでした) お手数をおかけしますが、このように書き換えていただければ幸いです。
メンテ
Re: unknown type name 'IUnknown' ( No.6 )
名前:管理人 日時:2016/12/18 12:43

ご情報ありがとうございます #if !defined(CINTERFACE) && ... の箇所をご指定の通りに変更してみましたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.exe // C++ Builder 10.1 Berlin 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』をして下さい)
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存