编译ActiveMQ-CPP库遇到的那点事

编译ActiveMQ-CPP库遇到的那点事

工作需要,需要编译ActiveMQ-cpp库,现将编译过程中遇到的问题及解决办法记录下来,以供他人参考,少走弯路。
ActiveMQ-CPP从2.2版本以后依赖Apache Portable Runtime项目,所以在编译之前需要先编译apr库。
从Apache Portable Runtime项目官网上下载最新的APR源代码,截至目前,最新的APR版本为1.7.0。

编译,遇到以下错误:

cl.exe /nologo /MD /W3 /Zi /O2 /Oy- /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /I "./include/private" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" /D "WINNT" /D "_WINDOWS" /Fo".\x64\LibR\\" /Fd".\x64\LibR\apr-1" /FD /c .\atomic\win32\apr_atomic.c 
apr_atomic.c 
        cl.exe /nologo /MD /W3 /Zi /O2 /Oy- /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /I "./include/private" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" /D "WINNT" /D "_WINDOWS" /Fo".\x64\LibR\\" /Fd".\x64\LibR\apr-1" /FD /c .\dso\win32\dso.c 
dso.c 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2143: syntax error: missing ')' before '*' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2143: syntax error: missing '{' before '*' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2059: syntax error: ')' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2061: syntax error: identifier 'apr_winapi_pfn_if_indextoname' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2059: syntax error: ';' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2513: ' ': no variable declared before '=' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2065: 'apr_winapi_pfn_if_indextoname': undeclared identifier 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): warning C4047: '=': 'int' differs in levels of indirection from 'int *(__cdecl *)(NET_IFINDEX,PCHAR)' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2146: syntax error: missing ';' before identifier 'apr_load_dll_func' 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2100: illegal indirection 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): error C2064: term does not evaluate to a function taking 19 arguments 
e:\apr-1.7.0\include\arch\win32\apr_arch_misc.h(503): warning C4033: 'apr_winapi_if_indextoname' must return a value 
NMAKE : fatal error U1077: '"d:\Program Files (x86)\Microsoft Visual Studio 2017\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\cl.exe"' : return code '0x2' 
Stop. 

解决办法:在include文件夹下找到apr.hw文件,以文本方式打开,找到宏定义“#define _WIN32_WINNT 0x0501”,将0x0501改为0x0600。至于为什么改成0x0600,笔者也是参考了一个网址编译APR报错

继续编译,然后遇到错误“找不到apr_escape_test_char.h头文件”。
解决办法:可以自己新建一个头文件,内容如下:

/* this file is automatically generated by gen_test_char, do not edit. "make include/private/apr_escape_test_char.h" to regenerate. */
#define T_ESCAPE_SHELL_CMD     (1)
#define T_ESCAPE_PATH_SEGMENT  (2)
#define T_OS_ESCAPE_PATH       (4)
#define T_ESCAPE_ECHO          (8)
#define T_ESCAPE_URLENCODED    (16)
#define T_ESCAPE_XML           (32)
#define T_ESCAPE_LDAP_DN       (64)
#define T_ESCAPE_LDAP_FILTER   (128)

static const unsigned char test_char_table[256] = {
    224,222,222,222,222,222,222,222,222,222,223,222,222,223,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,6,16,127,22,17,23,49,17,
    145,145,129,80,80,0,0,18,0,0,0,0,0,0,0,0,0,0,16,87,
    119,16,119,23,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,23,223,23,23,0,23,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,23,23,23,17,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
    222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222 
};

虽然注释说这个头文件是自动产生的,不要修改,水平有限,笔者不知道这个文件如何生成,直接拿来用时并没有发现其它问题。继续编译,OK,大功告成,成功编译出apr-1.lib静态库。

接下来编译ActiveMQ-CPP则较为简单,需要将上面编译好的APR库include文件下的头文件及.lib库添加到ActiveMQ-CPP的工程属性中。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为使用 `activemq-cpp` 创建一个上传接,你需要以下步骤: 1. 导入 `activemq-cpp` : - 将 `activemq-cpp` 的头文件目录添加到你的项目中,以便在代码中包含相关头文件。 - 将 `activemq-cpp` 的文件(`.lib` 或 `.so` 文件)添加到你的项目中,以便在链接过程中使用。 2. 创建上传接口: - 在你的代码中,定义一个类或函数来处理上传操作。 - 使用 `activemq-cpp` 的API进行消息发布或发送。 - 可以根据你的需求,定义接口的参数、返回值和其他必要的功能。 下面是一个简单的示例,演示如何使用 `activemq-cpp` 创建一个上传接口: ```cpp #include <activemq/core/ActiveMQConnectionFactory.h> #include <activemq/core/ActiveMQConnection.h> #include <activemq/core/ActiveMQSession.h> #include <activemq/core/ActiveMQProducer.h> void uploadFile(const std::string& fileName, const std::string& message) { // 创建 ActiveMQ 连接工厂 activemq::core::ActiveMQConnectionFactory factory("tcp://localhost:61616"); // 创建 ActiveMQ 连接 activemq::core::ActiveMQConnection* connection = factory.createConnection(); connection->start(); // 创建 ActiveMQ 会话 activemq::core::ActiveMQSession* session = connection->createSession(); // 创建消息目的地(队列或主题) activemq::core::ActiveMQDestination* destination = session->createTopic("myUploadTopic"); // 创建消息生产者 activemq::core::ActiveMQProducer* producer = session->createProducer(destination); // 创建消息 activemq::core::ActiveMQTextMessage* textMessage = session->createTextMessage(message); textMessage->setStringProperty("FileName", fileName); // 发送消息 producer->send(textMessage); // 清理资源 delete destination; delete producer; delete textMessage; delete session; delete connection; } ``` 在这个示例中,我们使用 `activemq-cpp` 创建了一个 `uploadFile` 函数,用于上传文件。它使用 ActiveMQ 连接工厂、连接、会话、目的地和消息生产者来发送消息。你可以根据你的实际需求进行调整和扩展。 请注意,上述示例假设你已经在本地运行了 ActiveMQ 代理,并且已经创建了一个名为 "myUploadTopic" 的主题。你可以根据实际情况修改连接字符串和目的地的名称。 这只是一个简单的示例,实际中可能需要更多的错误处理、参数验证等功能。根据你的需求,你可以进一步扩展和优化上传接口的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值