Bubble

小六家的藏宝图

在aarch64机子上编译rocketmq-client-cpp

2022-11-16 Study 喵小六

这段时间一直在折腾 arm 机子的编译,很痛苦,非常痛苦,用了华为云之后就更加痛苦了。

我开通了一个按需付费的华为云 arm 机子,开通过程也没有要求付费,然后我就直接登录开始用了,使用过程也没有提醒我要交钱,然后一个小时后,我正在编译呢,啪!给我关机了,很快啊。我正纳闷怎么终端没反应了,滴滴两个短信来了,说您已欠费。(血压UP.jpg)

大概华为他妈在 ICU 急救的时候,推进去急诊了,然后抢救了一半,医生突然出门说刚把他妈管子拔了,请你先去前台交个钱起。

📌 commit: de41701d7e9a6a78bbe4d34578e444e27a499394

🛠 编译环境

  • arch: aarch64
  • OS: OpenEuler 20.03 SP3
  • gcc: 8.5.0

Prepare

根据文档安装依赖(https://github.com/apache/rocketmq-client-cpp#linux-and-mac-os

$ sudo dnf -y install gcc-c++ cmake automake autoconf libtool bzip2-devel zlib-devel
......
Upgraded:
  cpp-8.5.0-4.el8_5.aarch64        gcc-8.5.0-4.el8_5.aarch64        libgcc-8.5.0-4.el8_5.aarch64        libgomp-8.5.0-4.el8_5.aarch64        libstdc++-8.5.0-4.el8_5.aarch64
Installed:
  autoconf-2.69-29.el8.noarch            automake-1.16.1-7.el8.noarch          bzip2-devel-1.0.6-26.el8.aarch64  cmake-3.20.2-4.el8.aarch64             cmake-data-3.20.2-4.el8.noarch
  cmake-filesystem-3.20.2-4.el8.aarch64  cmake-rpm-macros-3.20.2-4.el8.noarch  gcc-c++-8.5.0-4.el8_5.aarch64     libstdc++-devel-8.5.0-4.el8_5.aarch64  libtool-2.4.6-25.el8.aarch64
  libuv-1:1.41.1-1.el8_4.aarch64         perl-Thread-Queue-3.13-1.el8.noarch   zlib-devel-1.2.11-17.el8.aarch64

⚠️ 如果你的网络不通,还需要准备如下包放到项目根目录

  • openssl-1.1.1d.tar.gz
  • libevent-release-2.1.11-stable.zip
  • jsoncpp-0.10.7.zip
  • boost_1_58_0.tar.gz

Build

修改 build.sh 给 boost 编译指定 arm 相关的选项 -architecture=armaddress-model=64

BuildBoost() {
  ......
  if [ $verbose -eq 0 ]; then
    echo "build boost without detail log."
    ./b2 architecture=arm address-model=64 -j$cpu_num cflags=-fPIC cxxflags=-fPIC --with-atomic --with-thread --with-system --with-chrono --with-date_time --with-log --with-regex --with-serialization --with-filesystem --with-locale --with-iostreams threading=multi link=static release install --prefix=${install_lib_dir} &> boostbuild.txt
  else
    ./b2 architecture=arm address-model=64 -j$cpu_num cflags=-fPIC cxxflags=-fPIC --with-atomic --with-thread --with-system --with-chrono --with-date_time --with-log --with-regex --with-serialization --with-filesystem --with-locale --with-iostreams threading=multi link=static release install --prefix=${install_lib_dir}
  fi
  ......
}

修改 CMakeList.txt 删除 x86_64 的相关编译选项 -m64-m32

        #    if (CMAKE_BUILD_BITS EQUAL 32)
        #        list(APPEND CXX_FLAGS "-m32")
        #    else () #not-condition
        #        list(APPEND CXX_FLAGS "-m64")
        #    endif ()

最后执行

$ sh ./build.sh

Troubleshooting

g++: error: unrecognized command line option ‘-m64’

openssl 和 libevent 和 jsoncpp 的编译过程都很顺利,但是 boost-1.58.0 的编译时有如下错误

g++: error: unrecognized command line option ‘-m64’

-m64 是 x86_64 机器的编译选项,很显然它没有识别到这是台 arm 机子,观察日志也证实了这个猜想

Performing configuration checks

    - 32-bit                   : no
    - 64-bit                   : yes
    - arm                      : no
    - mips1                    : no
    - power                    : no
    - sparc                    : no
    - x86                      : no
    - combined                 : no

根据 stackoverflow 相关问题 的回答,有两个解决办法,本文选择了后者,手动指定 arch 类型

rocketmq-client-cpp 编译的时候也报了相同的错误,解决办法是注释 CMakeList.txt 中相关的内容。(ref: RocketMQ-cpp-client 在arm下的安装[blog.csdn.net]