6

我正在尝试获得一些用 C++ 编写的功能,以与位于 Linux 机器上的 Apache ActiveMQ(本机使用 JMS)进行通信。为了建立这种联系,我尝试在我的 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 的经验非常有限,所以也许只是我不理解手动链接的依赖项......如果打开提到的文件并查看中所述的函数错误消息,但是,代码显然也有问题,所以可能不是依赖关系,请参阅两个屏幕转储。

关于可能的解决方案,我被建议尝试手动构建每个项目,而不是一次构建整个解决方案,因此首先构建不依赖任何东西的库,依此类推。然而,这也没有成功。

也应该可以使用命令行来构建项目,这对某些人来说是诀窍(链接)。在较新版本的 Visual Studio 中,“msdev”似乎已被“devenv”取代,但即使考虑到这一点,在使用查找和替换后,构建仍然会抱怨“未找到 msdev”......也许不是最好的修复,对吧?

在搜索有类似问题的帖子时,我肯定并不孤单,但不幸的是,没有一个建议的解决方案对我有用。我看过的一些帖子是: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 Tools 并启动Developer Command Prompt。从那里导航到 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然后使用if build for x64 架构继续上述步骤。

这成功构建了 APR 并放入C:\dist\APR\x64


然后在 Visual Studio 中确保C:\dist\APR\x64\includes在项目属性的 Additional Includes 中链接。

  1. 右键单击您的项目并选择属性
  2. 展开配置属性
  3. 展开 C/C++
  4. 选择常规
  5. Edit Additional Include Directories and add C:\path\to\APR\arch\include
  6. Apply changes

Building at this point yields the following errors (See below for solution):

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

To resolve the errors edit activemq-cpp-library-3.9.4\src\main\decaf\internal\security\windows\SecureRandomImpl.cpp by adding #include <memory>at the top of the file.

Rebuilding after adding the above include results in a successful build of ActiveMQ.

Output to: activemq-cpp-library-3.9.4\vs2010-build\\Win32\Release\libactivemq-cpp.lib

于 2017-04-18T21:26:47.317 回答
1

I've built the ActiveMQ on Visual Studio 2012 pro by using APR that available in the NuGet repository. In my case, some configuration fails to link. A simple path fix in the Link section of the project properties will make it work.

I haven't manage to get the unit test running though.

于 2017-07-26T10:01:12.573 回答