2011-01-31 10 views
4

ライブラリーをバイナリーとして配布しているとします。デバッグとリリースという2つのバージョンで出荷されています。デバッグとリリースは互いに互換性がありません。ユーザーはリリース実行可能ファイルを作成し、リリースライブラリにリンクする必要があります。ライブラリーと実行可能ファイルに同じ構成が使用されていることを確認する

ライブラリと実行可能なバージョンの間に不一致がある場合、現時点ではわかりにくい微妙なエラーが発生します。代わりに、好ましくはリンク時に不一致があることを通知する、本当に明確なエラーメッセージを表示したいと思います。

これを達成するにはどうすればよいでしょうか?私はあなたが静的ライブラリを使用しており、バイナリでコンパイル時にリンクされるの.libを意味すると仮定するつもりです

#ifndef RELEASE_VERSION 
#error Release version required 
#endif 

答えて

6

:コンパイルを中止します

-1

使用#error指令、 (実行時に不一致となるかもしれないdllなどとは対照的に)。メインに今

#ifdef _RELEASE //or whatever your compiler uses 
void InitialiseLibraryRelease() 
{ 
    CommonInitialise(); 
} 
#else 
void InitialiseLibraryDebug() 
{ 
    CommonInitialise(); 
} 
#endif 

は、最も簡単な方法は、ライブラリのCPPファイルに

#ifdef _RELEASE //or whatever your compiler uses 
#define InitialiseLibrary InitialiseLibraryRelease 
#else 
#define InitialiseLibrary InitialiseLibraryDebug 
#endif 

同様に、あなたの.hファイル内の構造物のこの種を持っているように思えますライブラリを使用しているexe:

InitialiseLibrary(); 

ライブラリのリリースとexe don tがリンクに一致すると1つまたは他のInitialiseLibrary ...関数と一致しないことを報告します。

別の方法として、リリースライブラリとデバッグライブラリを異なる名前のファイルにコンパイルし、.hファイルで(プロジェクトにライブラリを明示的に含めるのではなく)#pragmaを使用して動作するようにすることができます。 上記の#ifdefを使用すると、#pragmaを使用するかどうかを選択してリンクするライブラリをコンパイル時に選択できます。この2番目のテクニックは、あなたの質問に正確には言及していません(プログラマーが強制しようとするとリンクを止めないので)が、この種の難しさに対処する通常の方法です(複雑なビルド環境では利点があります)

+0

-1質問者はライブラリとMATCHの実行可能ファイルを望んでいます。彼はコンパイルされたリリースを望んでいません。 – Elemental

+0

@Elemental: "ユーザーがリリース実行ファイルを作成した場合など" - プリプロセッサの魔法が絵の外に出ていない! – Christoph

0

インストールスクリプトのバイナリ/ライブラリのチェックサムも可能です。しかし、Cの答えではありません。

関連する問題