在Go应用中使用activemq-cpp遇apr_pool_t类型未定义编译错误
解决
apr_pool_t未定义编译错误 问题分析
添加decaf::lang::System::setProperty后触发的apr_pool_t未定义错误,本质是编译C++ wrapper时,编译器找不到APR库的头文件或未正确链接APR库——即便你已经安装了APR依赖,编译命令里没指定相关参数,编译器还是无法识别APR的类型和函数。
具体修复步骤
1. 补全APR头文件引用
在你的C++ wrapper代码顶部,手动添加APR池的头文件:
#include <apr_pools.h>
ActiveMQ-CPP依赖的Decaf库会间接用到APR的池类型,但部分场景下不会自动引入该头文件,手动添加可解决类型未定义问题。
2. 调整编译命令,添加APR及相关库的链接参数
编译C++ wrapper时,必须明确指定APR、Decaf、ActiveMQ-CPP的链接库,同时指定头文件路径(如果不在系统默认路径)。
示例编译命令(以你的wrapper文件名为activemq_wrapper.cpp为例):
# 编译目标文件 g++ -c -o activemq_wrapper.o activemq_wrapper.cpp \ -I/usr/include/apr-1.0 \ # APR头文件路径,按需调整 -I/usr/local/include/activemq-cpp-3.9.3 \ # ActiveMQ-CPP头文件路径,替换为你的实际版本 -I/usr/local/include/decaf-2.10.1 # Decaf头文件路径,替换为你的实际版本 # 生成动态库供Go调用 g++ -shared -o libactivemq_wrapper.so activemq_wrapper.o \ -lapr-1 -laprutil-1 \ # 链接APR核心库和工具库 -ldecaf -lactivemq-cpp # 链接Decaf和ActiveMQ-CPP库
注意:路径部分要根据你本地ActiveMQ-CPP、Decaf的安装版本和路径调整,比如如果是通过包管理器安装的,头文件可能在/usr/include下,无需额外指定-I参数。
3. 验证ActiveMQ-CPP编译依赖的APR版本
如果你是手动编译ActiveMQ-CPP而非通过包管理器安装,要确保编译ActiveMQ-CPP时使用的是系统安装的APR库(而非源码内置的APR)。如果之前编译ActiveMQ-CPP时指定了内置APR,可能会导致链接系统APR时出现版本不兼容,此时需要重新编译ActiveMQ-CPP,指定使用系统APR:
cd activemq-cpp-src mkdir build && cd build cmake .. -DAPR_INCLUDE_DIR=/usr/include/apr-1.0 -DAPR_LIBRARY=/usr/lib/x86_64-linux-gnu/libapr-1.so make && sudo make install
内容的提问来源于stack exchange,提问作者pocockn
相关产品推荐
相关产品推荐

