c++ - 如何在 Windows 上构建 Apache ActiveMQ-CPP(和 APR)?

标签 c++ visual-studio activemq apr activemq-cpp

我正在尝试获取一些用 C++ 编写的功能,以便与位于 Linux 机器上的 Apache ActiveMQ(它 native 使用 JMS)进行通信。为了建立这种联系,我尝试在我的 Windows 7 机器(开发机器)上设置 Apache ActiveMQ-CPP,但我目前面临一些主要问题。

据我所知,ActiveMQ-CPP 依赖于 Apache Portable Runtime/APR,如 here 所述.我的问题是,我什至无法构建 APR,因此无法开始使用 ActiveMQ-CPP。我关注了this guide从字面上看,在并行目录中设置,将版本名称重命名为标准名称并将启动项目更改为 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 的经验非常有限,所以也许这只是我不明白手动链接的依赖关系……如果打开提到的文件并查看错误消息中说明的功能,但是,代码显然也有问题,所以可能不是依赖项,请参见两个屏幕转储。

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

也应该可以使用命令行来构建项目,这对某些人来说已经成功了(link)。在较新版本的 Visual Studio 中,“msdev”似乎已被“devenv”取代,但尽管考虑到这一点,构建仍然会在使用查找和替换后提示“找不到 msdev”……也许不是最好的解决方法,对吗?

在搜索有类似问题的帖子时,我肯定不是唯一一个,但不幸的是,没有一个建议的解决方案对我有用。我看过的一些帖子是:Compile Apache APR on WindowsActiveMQ-CPP and Visual Studio 2003 .

你们中有人有过使用较新版本的 Visual Studio 或 Windows 上的命令行构建 APR 的经验吗?或者更重要的是,让 ActiveMQ-CPP 在 Windows 上运行?

截图:

最佳答案

我能够使用 ActiveMQ 源代码中 README.txt 中的说明通过命令行构建 APR。

6.2.1 APR library.

APR is provided in source form only from the Apache Software Foundation. You will need to build a library from source by downloading the latest release from:

http://apr.apache.org/

At the time of this writing the latest version was v1.5.2 and is recommended since its build support files are working with the Visual Studio 2010 tools.

APR is built from the command line using its provided Make files. When building the library you need to ensure you are in the right environment to produce the desired architecture builds (x64 or win32). You can open a command line that's correct by using the shortcuts under the Visual Studio start menu location (ex. Visual Studio 2010 / Visual Studio Tools / Visual Studio x64 win 64 Command Prompt

Once you are in the proper command prompt change to the directory where your APR source code is located (ex: C:\APR) and then run the build for the library to produce the desired ARCH build.

For a 32 bit library which installs into a proper distribution directory run:

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

and for a 64 bit build of the library use the command.

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 Studio 中确保 C:\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

关于c++ - 如何在 Windows 上构建 Apache ActiveMQ-CPP(和 APR)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43409419/

相关文章:

jms - 红帽 AMQ 和 Apache ActiveMQ 有什么区别?

c++ - 更改 vector 中的位置值 + 自动创建该位置并在需要时增加 vector 范围

c++ - 是否有默认设置为 -1>>1 != -1 的 C99 编译器?

c++ - 在没有 header 的 Visual Studio 项目中使用 .dll 文件

c++ - 通过 "stitching"访问 C++ 中的变量及其名称

node.js - 无法获取/错误

c# - 如何立即抛出 List<CustomExceptionObj> 异常

java - ActiveMQ-如何检测非 Activity 主题

java - 如何确保来自 JMS 队列的消息传递到外部 WebService (CXF)?

c++ - 在 "/="部分使用运算符 'declare&initialize'