如何在 Windows 上构建 Apache ActiveMQ-CPP(和 APR)?
How to build Apache ActiveMQ-CPP (and APR) on Windows?
我正在尝试获取一些用 C++ 编写的功能,以便与位于 Linux 机器上的 Apache ActiveMQ(本机使用 JMS)进行通信。为了建立这种连接,我尝试在我的 Windows 7 机器(开发机器)上设置 Apache ActiveMQ-CPP,但我目前面临一些主要问题。
据我所知,ActiveMQ-CPP 依赖于 Apache Portable Runtime/APR,如信中所述 here. My problem is, that I cannot even build APR and hence not getting started with ActiveMQ-CPP. I have followed 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 手动...如果打开提到文件并查看错误消息中所述的功能,但是,代码显然也有问题,所以可能不是依赖关系,请参阅两个屏幕转储。
关于可能的解决方案,有人建议我尝试手动构建每个项目,而不是一次构建整个解决方案,因此首先构建不依赖于任何内容的库,依此类推。然而,这也没有成功。
也应该可以使用命令行来构建项目,这对某些人来说已经成功了 (link)。 "msdev" 在 Visual Studio 的较新版本中似乎被 "devenv" 取代,但尽管考虑到这一点,构建仍然在使用查找和替换后抱怨 "msdev not found" ...也许不是最好的解决办法,是吧?
在搜索有类似问题的帖子时,我肯定不是一个人,但不幸的是 none 的建议解决方案对我有用。我看过的一些帖子是:Compile Apache APR on Windows and ActiveMQ-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 I 运行 nmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean
更通用:
转到:开始菜单 > 所有程序 > Visual Studio 2017 > Visual Studio 工具 > VC 并启动命令提示符您正在为其构建的架构。如果为 x64 架构构建,则使用 nmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean
继续上述步骤。
这成功构建了APR并把它放在C:\dist\APR\x64
然后在 Visual Studio 中确保 C:\dist\APR\x64\includes
在项目属性的附加包含中链接。
- 右键单击您的项目和 select 属性
- 展开配置属性
- 展开C/C++
- Select 一般
- 编辑附加包含目录并添加 C:\path\to\APR\arch\include
- 应用更改
此时构建会产生以下错误(解决方案见下文):
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 Studio17\Community\VC\Tools\MSVC.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
我使用 NuGet 存储库中提供的 APR 在 Visual Studio 2012 pro 上构建了 ActiveMQ。就我而言,某些配置无法 link。项目属性的 Link 部分中的简单路径修复将使其工作。
不过我还没有通过单元测试运行。
我正在尝试获取一些用 C++ 编写的功能,以便与位于 Linux 机器上的 Apache ActiveMQ(本机使用 JMS)进行通信。为了建立这种连接,我尝试在我的 Windows 7 机器(开发机器)上设置 Apache ActiveMQ-CPP,但我目前面临一些主要问题。
据我所知,ActiveMQ-CPP 依赖于 Apache Portable Runtime/APR,如信中所述 here. My problem is, that I cannot even build APR and hence not getting started with ActiveMQ-CPP. I have followed 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 手动...如果打开提到文件并查看错误消息中所述的功能,但是,代码显然也有问题,所以可能不是依赖关系,请参阅两个屏幕转储。
关于可能的解决方案,有人建议我尝试手动构建每个项目,而不是一次构建整个解决方案,因此首先构建不依赖于任何内容的库,依此类推。然而,这也没有成功。
也应该可以使用命令行来构建项目,这对某些人来说已经成功了 (link)。 "msdev" 在 Visual Studio 的较新版本中似乎被 "devenv" 取代,但尽管考虑到这一点,构建仍然在使用查找和替换后抱怨 "msdev not found" ...也许不是最好的解决办法,是吧?
在搜索有类似问题的帖子时,我肯定不是一个人,但不幸的是 none 的建议解决方案对我有用。我看过的一些帖子是:Compile Apache APR on Windows and ActiveMQ-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 I 运行 nmake -f Makefile.win ARCH="Win32 Release" PREFIX=C:\dist\APR\x64 buildall install clean
更通用:
转到:开始菜单 > 所有程序 > Visual Studio 2017 > Visual Studio 工具 > VC 并启动命令提示符您正在为其构建的架构。如果为 x64 架构构建,则使用 nmake -f Makefile.win ARCH="x64 Release" PREFIX=C:\dist\APR\x64 buildall install clean
继续上述步骤。
这成功构建了APR并把它放在C:\dist\APR\x64
然后在 Visual Studio 中确保 C:\dist\APR\x64\includes
在项目属性的附加包含中链接。
- 右键单击您的项目和 select 属性
- 展开配置属性
- 展开C/C++
- Select 一般
- 编辑附加包含目录并添加 C:\path\to\APR\arch\include
- 应用更改
此时构建会产生以下错误(解决方案见下文):
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 Studio17\Community\VC\Tools\MSVC.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
我使用 NuGet 存储库中提供的 APR 在 Visual Studio 2012 pro 上构建了 ActiveMQ。就我而言,某些配置无法 link。项目属性的 Link 部分中的简单路径修复将使其工作。
不过我还没有通过单元测试运行。