2017-12-04 6 views
0

コンパイル時に使用した同じバージョンのdllライブラリをユーザーに強制的に使用させる標準的な方法はありますか?別のバージョンでコンパイルされたライブラリを使用しないようにする方法

私は機能とバージョン1.0のライブラリを持っていると仮定しましょう:バージョン1.1では

extern "C" void A(); 

私は変更例えば壊す追加しました:私は持っているので、この関数に別のパラメータを:

extern "C" void A(int); 

dllのエクスポートされた名前はまったく同じですが、開発者がバージョン1.1の製品をコンパイルして顧客に送信すると、製品(exeファイル)のみが更新され、すべてが失敗します。そして、実行時に(この変更された機能がいつ実行されるかに依存して)ランダムな点で失敗する可能性があります。

ライブラリを間違ったバージョンで読み込むことを防ぐ標準的な方法はありますか?私は主にWindowsのdllファイルのソリューションに興味があります。 (ただし、他のプラットフォーム固有の解決策がある場合は、コメントを残してください)

上記の例は単純化されています。 C++ manglingを追加すると上記の特定の問題は解決しますが、私はもっと一般的な解決策を探しています。

私の考えは、ライブラリヘッダーファイルに静的オブジェクトを追加することです。コンストラクタ内のこの静的オブジェクトは、ライブラリのメソッドを実行することができ、nameのメソッドは、次のように現在のバージョンをエンコードしています:init_library_1_1();だからメソッドがdllで見つからない場合は、非常に初心者で何かが間違っていることを確認してください。しかし、その解決策は、厄介な回避策のように見えます。そして、私は開発者がこのファイルをインクルードするように注意しなければなりません。

このような問題の解決策はありますか?

答えて

0

標準的な回答はありませんが、多くのコンパイラ/リンカのペアは、これらの種類のテストを実行するための非標準機能を備えています。

たとえば、Visual C++では出力オブジェクトファイルにレコードを配置し、リンクが実行されるとレコードがテストされ、一致しない場合はエラーが報告されます。 DLLが負荷中に静的にではなく実行時に動的にロードされた場合、これがうまくいくとは思えません。私はgcc/clangは似たようなものを持っていると信じていますが、詳細は分かりません。

+0

コメントありがとうございます。残念ながら、正しく理解すれば、静的ライブラリをリンクする場合にのみ役立ちます。私は実行時にソリューションを探しています。ユーザーがこのライブラリを使用するライブラリとアプリケーションのバージョンが一致していない場合 – AdamF

関連する問題