6

Linux マシン上にある Apache ActiveMQ (JMS をネイティブに使用) と通信するために、C++ で記述されたいくつかの機能を取得しようとしています。この接続を確立するために、Windows 7 マシン (開発マシン) に Apache ActiveMQ-CPP をセットアップしようとしましたが、現在いくつかの大きな問題に直面しています。

私が理解している限り、ActiveMQ-CPP は Apache Portable Runtime/APR に依存しています。私の問題は、APR をビルドすることさえできないため、ActiveMQ-CPP を開始できないことです。このガイドに従って、並列ディレクトリに設定し、バージョン名を標準名に変更し、スタートアップ プロジェクトを libaprutil (動的ライブラリを使用) に変更しましたが、うまくいきませんでした。APR ソリューションを構築すると、27 のプロジェクトのうち 13 しか成功しません。また、静的な aprutil プロジェクトをスタートアップ プロジェクトとして使用してソリューションを構築しようとしましたが、改善はありませんでした。

解決策は、Visual Studio 6 用に作成された幅広い互換性を確保することです。そのため、Visual Studio 2010 の使用が問題の原因であると思われます。プロジェクトのアップグレードは可能であるはずですが (APR ドキュメントに記載されているように)、アップグレード アシスタントを使用して後でソリューション全体をビルドしようとした後、プロジェクトにいくつかの (私が思うに) 不足している依存関係があります。最初のスクリーンダンプを参照してください。エラーの多くはファイル iconv_module.obj ( error LNK2019: unresolved external symbol xxx referenced in function _iconv_getpath C:\work\apr-iconv\iconv_module.obj) に関連しており、下部のツールチップに示されているように、ファイルは にありますC:\work\apr-iconv。ファイルは実際には、ビルド形式 (「Release」と「Win32」を選択) に応じて別のサブフォルダーにありますが、これが実際に問題であるかどうかはわかりません。

私はC ++にまったく慣れておらず、Cの経験が非常に限られているため、手動でリンクすることを理解していない依存関係にすぎない可能性があることを言及する必要があります...言及されたファイルを開いて、ただし、エラー メッセージには明らかにコードにも問題があるため、依存関係ではない可能性があります。両方のスクリーン ダンプを参照してください。

考えられる解決策については、ソリューション全体を一度にビルドするのではなく、一度に各プロジェクトを手動でビルドすることをお勧めします。そのため、何にも依存しないライブラリが最初にビルドされます。しかし、これも成功していません。

コマンド ラインを使用してプロジェクトをビルドすることもできるはずです。"msdev" は、新しいバージョンの Visual Studio では "devenv" に置き換えられているようですが、これを念頭に置いても、検索と置換を使用した後、ビルドはまだ "msdev not found" について不平を言っています...おそらく最善の修正ではないでしょうか?

同様の問題を持つ投稿を検索するとき、私は確かに一人ではありませんが、残念ながら、提案された解決策のどれも私にとってうまくいきませんでした. 私が見た投稿のいくつかは、Compile Apache APR on Windows and ActiveMQ-CPP and Visual Studio 2003です。

新しいバージョンの Visual Studio または Windows のコマンド ラインを使用して APR を構築した経験のある方はいますか? それとももっと重要なことは、ActiveMQ-CPP を Windows で動作させることですか?

スクリーンショット:

4

2 に答える 2

2

ActiveMQ ソースの README.txt の指示に従って、コマンド ラインから APR をビルドできました。

6.2.1 APR ライブラリ。

APR は、Apache Software Foundation からのみソース形式で提供されます。以下から最新のリリースをダウンロードして、ソースからライブラリをビルドする必要があります。

http://apr.apache.org/

この記事の執筆時点では、最新バージョンは v1.5.2 であり、そのビルド サポート ファイルが Visual Studio 2010 ツールで動作するため、推奨されています。

APR は、提供されている Make ファイルを使用してコマンド ラインからビルドされます。ライブラリをビルドするときは、目的のアーキテクチャ ビルド (x64 または win32) を生成するための適切な環境にいることを確認する必要があります。Visual Studio のスタート メニューの場所にあるショートカットを使用して、正しいコマンド ラインを開くことができます (例: Visual Studio 2010 / Visual Studio Tools / Visual Studio x64 win 64 Command Prompt

適切なコマンド プロンプトが表示されたら、APR ソース コードが配置されているディレクトリ (例: C:\APR) に移動し、ライブラリのビルドを実行して目的の ARCH ビルドを生成します。

適切な配布ディレクトリにインストールされる 32 ビット ライブラリの場合は、次を実行します。

nmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean

ライブラリの 64 ビット ビルドの場合は、コマンドを使用します。

nmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean


やった:

[スタート] メニュー > [すべてのプログラム] > [Visual Studio 2017] > [Visual Studio ツール]に移動し、開発者コマンド プロンプト を起動します。そこから APR ソースの場所に移動し、適切なコマンドを実行します。64ビットのWindows 7で実行しましたnmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean

より一般的な:

[スタート] メニュー > [すべてのプログラム] > [Visual Studio 2017] > [Visual Studio ツール] > [VC]に移動し、ビルド対象のアーキテクチャのコマンド プロンプトを起動します。次にnmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean、x64 アーキテクチャ用にビルドする場合に上記の手順を続けます。

これでAPRのビルドに成功し、入れましたC:\dist\APR\x64


次に、Visual StudioC:\dist\APR\x64\includesで、プロジェクト プロパティの追加インクルードにリンクされていることを確認します。

  1. プロジェクトを右クリックし、[プロパティ] を選択します
  2. 構成プロパティの展開
  3. C/C++ を展開する
  4. 一般を選択
  5. 追加のインクルード ディレクトリを編集し、C:\path\to\APR\arch\include を追加します
  6. 変更を適用

この時点でビルドすると、次のエラーが発生します (解決策については以下を参照してください)。

1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2039: 'auto_ptr': is not a member of 'std'
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\include\sstream(13): note: see declaration of 'std'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2143: syntax error: missing ';' before '<'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(53): error C2238: unexpected token(s) preceding ';'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(55): error C2614: 'decaf::internal::security::SRNGData': illegal member initialization: 'random' is not a base or member
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(74): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(74): error C2228: left of '.reset' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(96): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(96): error C2228: left of '.get' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(99): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(99): error C2227: left of '->setSeed' must point to class/struct/union/generic type
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(117): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(117): error C2228: left of '.get' must have class/struct/union
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(140): error C2039: 'random': is not a member of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(45): note: see declaration of 'decaf::internal::security::SRNGData'
1>..\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp(140): error C2227: left of '->nextBytes' must point to class/struct/union/generic type

エラーを解決するには、ファイルの先頭にactivemq-cpp-library-3.9.4\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp追加して編集します。#include <memory>

上記のインクルードを追加した後に再構築すると、ActiveMQ の構築が成功します。

出力先:activemq-cpp-library-3.9.4\vs2010-build\\Win32\Release\libactivemq-cpp.lib

于 2017-04-18T21:26:47.317 に答える
1

NuGet リポジトリで利用可能な APR を使用して、Visual Studio 2012 pro で ActiveMQ を構築しました。私の場合、一部の構成がリンクに失敗します。プロジェクト プロパティの [リンク] セクションでパスを修正するだけで機能します。

ただし、単体テストを実行することはできません。

于 2017-07-26T10:01:12.573 に答える