1

そのため、ランタイムライブラリをリンクできない、または例外を使用できない環境で作業しています。ただし、BOOSTまたはSTLのいずれかを利用したいと考えています。最初に、boost :: container :: string / vector / map / ...でリンクを試みましたが、リンカーエラーを解決できませんでした。

そのため、現在、STLのヘッダーにリンクしようとしています。そのために、次のプリプロセッサディレクティブを定義しました。

#define _HAS_ITERATOR_DEBUGGING 0

#define _HAS_EXCEPTIONS 0

#includeと正常にリンクでき、std :: vectorをインスタンス化できますが、push_back(32);を呼び出すと、ベクトル上で、次のリンカーエラーが表示されます。

error LNK2001: unresolved external symbol "void (__cdecl* std::_Raise_handler)(class stdext::exception const &)" (?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA)
error LNK2001: unresolved external symbol _invoke_watson
error LNK2001: unresolved external symbol "void __cdecl std::_Xlength_error(char const *)" (?_Xlength_error@std@@YAXPEBD@Z)

Visual Studio 2010(およびデフォルトのコンパイラ)を使用しています。近い将来、vs2012への移行を検討しています。これらのエラーの解決に役立つ場合は、迅速に移行できる可能性があります。

これらの制限(例外なし、ランタイムライブラリなし)の下でブーストまたはSTLのいずれかをリンクする方法はありますか?

ありがとう!環境制限があるため、STL/ブーストのメリットを見逃したくありません。

4

3 に答える 3

3

それはあなたが必要とするものに依存しますが、おそらくそうではありません。

C ++標準ライブラリのすべてのコンテナには、ランタイムライブラリに含まれているメモリ割り当てが必要です。だから、あなたは持つことはできません:

std::vector<>
std::set<>
std::map<>
std::list<>

あなたが使用できるかもしれません

std::array<>
std::tuple<>

しかし、あなたもそうではないかもしれません。

すべてのストリームにはメモリ割り当てが必要であり、ほとんどのストリームにはファイルI / Oシステムコールが必要であるため、それらもアウトになっています。

コンテナーを使用できないため、イテレーターのほとんどの機能は使用できなくなります。

幸いなことに、ほとんどのBoostサポートはヘッダーのみであるため、Boostライブラリとリンクする必要はありません。Boostの場合#includeは、適切なヘッダーを試してみてください。それがコンパイルされてリンクされれば、あなたは勝ちます。

于 2012-09-13T19:46:06.760 に答える
2

まず、明確化のポイント。標準テンプレート ライブラリを使用するために Boost は必要ありません。STL は、C++ 標準ライブラリの一部として、ずっと前に C++ に組み込まれました。Visual Studio 2010 の一部として既にそれを持っています。

「ランタイム ライブラリをリンクする」ことができないという意味を明確にする必要があります。標準の C および C++ ランタイム ライブラリを使用することさえ許可されていませんか? つまり、I/O も数学関数もありnewませdeleteん。標準ライブラリの使用が許可されている場合は、すでに STL を持っています。

ただし、ここに落とし穴があります。問題は、C++ 標準ライブラリが例外をスローすることです。例外は、標準ライブラリ関数がエラーを報告する優先メカニズムです。これらの関数はstd::bad_alloc、必要に応じてメモリを割り当てることができない場合にスローstd::out_of_rangeします。範囲内にあるかどうかを確認するアクセサーを使用するとスローしますthrow。これらの標準ヘッダーには、多くの呼び出しがあります。

「例外をスローしない」はあなただけに適用されますか、それとも標準ライブラリにも適用されますか? プログラマだけでなくライブラリにも当てはまる場合は、C++ コンテナー、C++ I/O、C++ 文字列、およびほぼすべての Boost を書き留めることができます。

于 2012-09-13T20:07:09.243 に答える
1

標準ライブラリから例外を排除するには、例外を使用しないライブラリビルドが必要です。これらのマクロの設定は、そのようなライブラリの構築と使用の一部です。Microsoftが例外のないバージョンのライブラリを出荷しているとは思いませんが、出荷している場合は、通常のライブラリではなく、それにリンクする必要があります。そうでない場合は、Microsoftにライブラリを提供している会社であるDinkumwareからライブラリのライセンスを取得することを検討する必要があります。www.dinkumware.com。

于 2012-09-13T20:12:25.377 に答える