2

長い投稿をお詫び申し上げます...

以前は、VSメニュー>ツール>オプション> VC++ディレクトリ>インクルードおよびライブラリファイルのディレクトリの下にSTLPortインクルードおよびライブラリディレクトリをリストしたときに、VC ++ソリューション(VS 2008を使用)を構築できました。ただし、.vcprojファイルと.slnファイルに完全に依存するビルドプロセスに移行したかったのです。これらは、各開発PCで個別に構成する必要があるVSオプションとは異なり、ソース管理にチェックインできます。ほとんどのライブラリの移行は、各プロジェクトのプロパティページ>構成プロパティ> C / C++>一般>追加のインクルードディレクトリにインクルードディレクトリを追加し、リンカー>一般>追加のライブラリディレクトリにライブラリディレクトリを追加することで処理しました。

残念ながら、このアプローチはSTLPortでは機能しません。リンク中にLNK2019およびLNK2001エラーが発生します。

Error   1   error LNK2019: unresolved external symbol "public: virtual bool __thiscall MyClass::myFunction(class stlp_std::basic_istream<char,class stlp_std::char_traits<char> > &,class MyOtherClass &,class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > &)const " (?myFunction@MyClass@@UBE_NAAV?$basic_istream@DV?$char_traits@D@stlp_std@@@stlp_std@@AAVSbprobScenarioData@@AAV?$basic_string@DV?$char_traits@D@stlp_std@@V?$allocator@D@2@@3@@Z) referenced in function _main MyLibrary.obj   

Error   5   error LNK2001: unresolved external symbol "public: static void __cdecl MyClass::myFunction(class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &,long,enum MyClass::MessageType,int,class stlp_std::basic_string<char,class stlp_std::char_traits<char>,class stlp_std::allocator<char> > const &)" (?myFunction@MyClass@@SAXABV?$basic_string@DV?$char_traits@D@stlp_std@@V?$allocator@D@2@@stlp_std@@000JW4MessageType@1@H0@Z)  MyLibrary.lib   

これは、実行可能プロジェクトをライブラリプロジェクトである依存関係にリンクしているときに発生します。不思議なことに、これはライブラリプロジェクト自体をリンクしている間は発生しません。何か案は?

4

6 に答える 6

3

Raymond Chen は最近、The Old New Thingでこれについて話しました。これらの問題の原因の 1 つは、ライブラリが 1 つのスイッチ セットでコンパイルされているのに、アプリが別のセットを使用していることです。あなたがしなければならないことは次のとおりです。

リンカーが探している正確なシンボルを取得します。それは恐ろしい混乱した名前になります。16 進エディター (IIRC、Visual Studio がこれを行います) を使用して、リンク先の .lib ファイルを確認します。リンカが探しているものとほぼ一致するシンボルを見つけますが、完全ではありません。記号の違いを考慮して、どのコマンド ライン スイッチが役立つかを考えてみてください。頑張ってください -- この種の問題に慣れていない人にとっては、解決策を見つけるのに数日かかることがあります (!)

于 2008-12-30T01:35:59.387 に答える
1

これらのリンクエラーはアプリケーションの特定のクラスがSTLPortを使用してコンパイルされていないか、ビルドから省略されていることを示しています。彼らはあなたがSTLportに対してリンクしていないことを示唆していません。

私の推測は次のようになります:

  • MyClassのビルド設定は、インクルードパスのプロジェクト全体の設定を何らかの形で上書きするため、MyClassはSTLportではなくデフォルトのC++STL実装を使用してビルドされています。これは簡単に確認できるはずです。オブジェクトファイルに対してdumpbinを実行し、そこにある関数がstlp_*名前空間の標準ライブラリを参照しているかどうかを確認してください。そうでない場合は、コンパイラが正しいインクルードパスを選択していない可能性があります。また、IDEがコンパイラを呼び出すコマンドラインも確認します。これらは、C /C++構成プロパティからも表示できます。
  • 他のポスターにも言及されているように、MyClassが構築されていない可能性がありますが、それは非常に簡単に確認できるはずです。
于 2008-11-15T21:00:21.900 に答える
1

ネイティブ IOStreams 実装を使用するには、STL ポートを構成する必要があります。

また、STLPort を使用する特定の理由はありますか? クロス プラットフォーム アプリケーションを作成しようとしている場合を除き、デフォルトの STL 実装をお勧めします。

于 2008-11-21T15:37:24.437 に答える
0

これはリンクエラーです。インクルードパスとは関係ありません。

MyClass.cppをプロジェクトに追加するのを忘れたか、これら2つの関数を定義するのを忘れました。

ライブラリプロジェクトを「リンク」するときにエラーが発生しない理由は、ライブラリプロジェクトがリンクされていないためです。これらは、LIBプログラムによってライブラリファイルにまとめられたOBJの集まりにすぎません。

于 2008-11-04T13:50:24.477 に答える
0

リンクする追加ライブラリのリストにライブラリ名を追加します。申し訳ありませんが、私はVSの最新バージョンの前にいて、それがどこに行くのかを正確に知りません.

于 2008-11-06T04:08:10.283 に答える