スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

_interlockedbittestandsetの衝突問題対策

WindowsSDKがインストールされた環境で、VCでビルドしたときに

error C2733: オーバーロードされた関数 '_interlockedbittestandset' の C リンケージの 2 回以上の宣言は許されません。

のようなメッセージが出てビルドに失敗することがあります。

どうも、WindowsSDKのヘッダに一部問題があり、windows.h、intrin.hを同時にインクルードした場合に、_interlockedbittestandsetという同名の異なるプロトタイプ宣言が衝突することにより、ビルドが失敗してしまうことがあるようです。

オープンソースのライブラリを使用する場合に、上記の問題への配慮が不足しているヘッダをインクルードした際に、コンパイルに失敗することがたまにあるのですが、その場合の対策について、こちらのブログにて説明されています。

ただし、上記ブログの解説では32bitビルドにしか対応しておらず、64bitではビルドエラーを解消できません。

32bit、64bitの両方に対応するには、

#define _interlockedbittestandset fk_m$_set
#define _interlockedbittestandreset fk_m$_reset
#define _interlockedbittestandset64 fk_m$_set64
#define _interlockedbittestandreset64 fk_m$_reset64
#include <intrin.h>
#undef _interlockedbittestandset
#undef _interlockedbittestandreset
#undef _interlockedbittestandset64
#undef _interlockedbittestandreset64

#include <windows.h>

... 問題のあるライブラリヘッダのインクルード ...


このようにインクルード部分を書き換えることで、正常にビルドできるようになります。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
最新記事
カテゴリ
Qt (21)
SDL (2)
MFC (2)
検索フォーム
月別アーカイブ
最新コメント
最新トラックバック
RSSリンクの表示
リンク
リンク(管理用)
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。