12

これは何よりも Visual Studio に関する質問かもしれません... VS10 と ZeroMQ 2.2.0 を使用して0MQ C++ の例
を 作成しようとしています。Windows ソース をダウンロードし、これらの手順に従って0MQ を静的にビルドしようとしました。具体的には:

  • リリースに切り替え
  • ソリューション内の 7 つのプロジェクトすべてについて:
    • General\Configuration Typeに設定Static library (.lib)
    • C/C++\Code Generation\Runtime Libraryに設定Multi-threaded (/MT)
    • ZMQ_STATICに追加C/C++\Preprocessor\Preprocessor Definitions
  • andが定義されている場合は thenも定義されるように更新zmq.hされましたzmq_utils.h_MSC_VERZMQ_STATICDLL_EXPORT

この時点で、0MQ はうまく構築されているようです。

  • 空のコンソール プロジェクトを作成しました。
    • リリースに変更
    • 上記のリンクの例で単一の cpp ファイルを追加しました
      • random、、randsrandomに変更srand_snprintf_snprintf
    • C/C++\Code Generation\Runtime Libraryに設定Multi-threaded (/MT)
    • ...\zeromq-2.2.0\includeにフォルダを追加しましたC/C++\General\Additional Include Directories
    • ...\zeromq-2.2.0\builds\msvc\Release\*.libに追加Linker\Input\Additional Dependencies

ただし、まだ次のリンク エラーが表示されます。

1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_bind
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_close
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_errno
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_init
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_data
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_strerror
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_socket
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_init_size
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_term
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_msg_close
1>zmqexp.obj : error LNK2001: unresolved external symbol __imp__zmq_send

私は何を逃したのですか?

4

3 に答える 3

17

「空のコンソール プロジェクト」にも追加する必要がZMQ_STATICあります。C/C++\Preprocessor\Preprocessor Definitionsそうしないと、アプリケーションをコンパイルするときにZMQ_EXPORTinzmq.hが として定義され__declspec(dllimport)、その結果、MSVC は の__imp__zmq_*代わりにシンボルを検索します。zmq_*

于 2012-04-29T12:41:01.063 に答える
2

静的リンクはあなたにとって非常に重要ですか? そうでない場合は、ここでelnino_9 による 2 番目の回答を試すことができます。elnino_9の答えを詳しく説明する:

  • ソースをダウンロードし、ローカル フォルダー (C:\dev\zeromq など) に解凍します。
  • C:\dev\zeromq-2.2.0\builds\msvc に移動し、msvc.sln ソリューションを開きます。MS2010 は VS2008 から VS2010 プロジェクトにアップグレードされます
  • すべてのプロジェクトをビルドします。
  • ビルドにより、次の 2 つのファイルが生成されます。
    • C:\dev\zeromq\lib\libzmq.lib - これは、プロジェクトのリンカー オプションで参照する必要があるものです
    • C:\dev\zeromq_boaz\builds\msvc\Release\libzmq.dll - これを実行するには、プロジェクトの実行可能ファイルと同じフォルダーにコピーする必要があります (ビルドが「デバッグ」に設定されている場合、パスはC:\dev\zeromq\builds\msvc\ Debug \libzmq.dll)
  • ソリューションとプロジェクトを作成します。以下をせよ:
    • ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] (一番下) を選択します。
    • 「C/C++ --> 一般 --> 追加のインクルード ディレクトリ」に移動し、C:\dev\zeromq\include を追加します。これは 0MQ のヘッダー ファイルを参照します。
    • 「リンカー --> 入力 --> 追加の依存関係」に移動し、前の手順の「libzmq.dll」ファイルへのフル パスを追加します。
    • プロジェクトをビルドします - これでエラーは発生しなくなります。
  • 「libzmq.dll」を実行可能ファイルと同じフォルダーにコピーします。これで、プロジェクトが実行されるはずです。

いくつかのコメント:

  • 「libzmq.lib」ファイルを参照する必要がある理由がわかりません。実行可能ファイルには必要ありません (必要なロジックが dll にあるため、削除しても実行されます)。誰かがこれを説明できますか?
  • Windows ユーザー向けの例では、1 つの警告に注意してください。2 番目のバインド ステートメント ( publisher.bind("ipc://weather.ipc");) によって例外が発生します。here で説明されているように(細字ではありますが)、プロセス間トランスポートは Windows ではサポートされていません。

編集

私の最初のコメントへの答えはMSDNで見つけることができると思います:

「呼び出し元の実行可能ファイルのソース コードがコンパイルまたはアセンブルされると、DLL 関数呼び出しによってオブジェクト コード内に外部関数参照が生成されます。この外部参照を解決するには、アプリケーションは、 DLL のメーカーです。」

于 2012-04-30T07:26:17.440 に答える