ページ 11

バージョンの異なる VisualC++ で作った lib ファイルのリンクについて

Posted: 2011年8月14日(日) 02:03
by lriki
お世話になっています。

今回は VisualC++ を使ったスタティックリンクライブラリの作成で
少し詰まってしまったので質問させていただきました。

※ちょっと前置きが長くなります・・・(汗



現在私はゲーム開発用のライブラリを作成しています。
それの公開にあたって、付属のサンプルを異なるバージョンのコンパイラ
(今のところ vc2008 と vc2010)で実行できるようにプロジェクトを準備しました。

しかし、2008 でビルドした lib ファイルを 2010、またその逆で使うと、以下のような
警告とエラーが大量に出るようになりました。


2008 で作って 2010 で使った時

コード:

error LNK2001: 外部シンボル ""public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ)" は未解決です。
...等

2010 で作って 2008 で使った時

コード:

warning LNK4229: 無効なディレクティブ '/FAILIFMISMATCH:_ITERATOR_DEBUG_LEVEL=2' が見つかりました。無視します。
error LNK2001: 外部シンボル ""void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPBD@Z)" は未解決です。
...等

これについて調べてみたところ、バージョンの異なるコンパイラ間で使おうとした場合に
このエラーが出るという記事が見つかりました。
http://watery.dip.jp/~slash/0363

この問題はとりあえずこれで解決できるかなと思ったのですが、ふと DXライブラリの事を思い出しました。


DXライブラリでは、配布されている lib ファイルだけで異なるバージョンのコンパイラでも動作します。
さらに、デバッグ情報云々の警告もひとつも出ません。

疑問に思って DXライブラリのプロジェクトを覗いてみたのですが、
これといって特別な設定をしているようではありませんでした。

ただ、プロジェクトの変換をしたときのレポートに「C++ コンパイラの準拠の変更~」等の
気になる警告をいくつか見つけました。


(▼ここからが今回お聞きしたいことです)

このことから、
「DXライブラリが警告のひとつもなくバージョンの異なる環境でもリンクできるのは、
DXライブラリをビルドしている環境はVisualC++の仕様が変更される前のものだから」
と考えたのですが、これは正しいのでしょうか?

もし違うようでしたら、2008 と 2010 の環境で「デバッグ情報が見つかりません」等の警告を出すことなく
正常にリンクさせるヒント等をいただけると助かります。

Re: バージョンの異なる VisualC++ で作った lib ファイルのリンクについて

Posted: 2011年8月14日(日) 20:55
by lriki
エラーの原因がわかったので報告です。


色々調べながら検証用のプロジェクト作って動かしてみたところ、
C++ の標準ヘッダの機能(多分 std::string や std::ifstream とかの文字列関係)を
lib 内で使用するとこのエラーが出ることがわかりました。
(DXライブラリをビルドしている環境とかは特に関係なかったみたいです)



以下、憶測まじってますけど、一応今回の原因について考えたことをメモしておきます。


さらっと調べた感じだと、STL の一部のパッケージ内では
VisualC++ ライブラリで用意されている機能が使われているらしいです。

そのため、今回のように異なるバージョン間で使用した場合、
VisualC++ のバージョンアップで変更された箇所の関数が無い、
と判断されるため、エラーが発生したと考えました。



この質問はとりあえず自己解決という形で終了させていただきます。
もし考えの間違い等の指摘がありましたらコメントお願いいたします。

Re: バージョンの異なる VisualC++ で作った lib ファイルのリンクについて

Posted: 2011年8月15日(月) 11:39
by lriki
解決チェック忘れてました(汗
失礼しました。

Re: バージョンの異なる VisualC++ で作った lib ファイルのリンクについて

Posted: 2011年8月16日(火) 09:59
by tk-xleader
VC++の異なるバージョンでビルドしたライブラリがリンクできないのは、C++のクラスの仮想関数やテンプレートなどがバージョンごとに違って、互換性がないからです。
DXライブラリが警告なくリンクできるのは、DXライブラリの関数は全てバージョン間で互換性のある型(たとえば、整数型やポインタ、C構造体)だけを引数や戻り値に使っているからです。

Re: バージョンの異なる VisualC++ で作った lib ファイルのリンクについて

Posted: 2011年8月16日(火) 11:33
by lriki
>tkmakwins15 さん

なるほど・・・ そんなに難しいことじゃなかったんですね。

勉強になりました。ありがとうございました。