记录一次使用 Ubuntu 编译 Wakaama 踩坑过程

1. 背景


公司项目需要使用 LwM2M 协议,由于是个相对冷门的小众协议,客户端模拟器几乎没有,只有 Eclipse Wakaama 相对来说功能齐全、易用,但是这个软件没有编译好的程序包,只能从 Github 拉取源码手动编译运行。
不知道什么原因,我这边联通网络无论是否挂梯子,都完全无法访问 Github 网站,于是我从 Gitee 上面找到一份复制的镜像仓库,以为这样就可以了。然而这个项目含有子模块,在 Gitee 无法使用 --recusive 拉取子模块,好在同事的网络可以,帮我把源码全部拉下来发给我了,也就是因为这样,才埋下了后面的深坑


2. 踩坑过程


以下所有操作均是在 Docker 镜像 Ubuntu:22.04 的容器中进行,默认是 root 用户,如果不是,所有命令需要添加 sudo

2.1 源码拉取

官方提供的拉取命令

git clone --recurse-submodules https://github.com/eclipse/wakaama.git

拉取完成后将源码拷贝至 Ubuntu 容器的 /tmp 目录下

# 启动 Ubuntu 容器
docker run -d -it --name ubuntu ubuntu:22.04 /bin/bash
# 拷贝源码至容器内
docker cp wakaama ubuntu:/tmp/

进入容器内部

docker exec -it ubuntu /bin/bash
2.2 安装依赖程序
apt-get update
apt-get install build-essential cmake libcurl4-openssl-dev libtool pkg-config

验证安装

$ cmake -version
cmake version 3.16.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).nformation.
2.3 编译 wakaama
cd /tmp/wakaama
mkdir build
cd build
cmake ..
make

直接报错如下:

root@0c28a21cddfa:/tmp/wakaama/build# make
[ 12%] Built target bootstrap_server
[ 29%] Built target lwm2mclient
[ 30%] Built target submodule_update
[ 30%] Performing autoconf step for 'external_tinydtls'
[ 31%] Performing autoheader step for 'external_tinydtls'
[ 31%] Performing configure step for 'external_tinydtls'
CMake Error at /tmp/wakaama/build/examples/client/external_tinydtls-prefix/src/external_tinydtls-stamp/external_tinydtls-configure-.cmake:49 (message):
  Command failed: 1

   '/tmp/wakaama/examples/shared/tinydtls/configure' '--host=cc'

  See also

    /tmp/wakaama/build/examples/client/external_tinydtls-prefix/src/external_tinydtls-stamp/external_tinydtls-configure-*.log


make[2]: *** [examples/client/CMakeFiles/external_tinydtls.dir/build.make:104: examples/client/external_tinydtls-prefix/src/external_tinydtls-stamp/external_tinydtls-configure] Error 1
make[1]: *** [CMakeFiles/Makefile2:294: examples/client/CMakeFiles/external_tinydtls.dir/all] Error 2
make: *** [Makefile:101: all] Error 2

根据提示查看错误日志

cat /tmp/wakaama/build/examples/client/external_tinydtls-prefix/src/external_tinydtls-stamp/external_tinydtls-configure-err.log

只有一行错误信息

.in'ig.status: error: cannot find input file: `Makefile

查阅资料发现是因为文件换行符是 doc 而不是 unix,这就是我开头提到的大坑,由于我把源码拉取到 windows 系统上,导致部分文件的换行符变成了 dos 格式的。
解决办法很简单,下载 vim 编辑器

apt-get install vim

找到报错的文件 configure.ac

root@0c28a21cddfa:/tmp/wakaama/build# find / -name "configure.ac"
/tmp/wakaama/examples/shared/tinydtls/configure.ac

使用 vim 编辑

vim /tmp/wakaama/examples/shared/tinydtls/configure.ac

在编辑页面输入以下命令并按回车即可转换格式

:set ff=unix

在这里插入图片描述
转换完成保存退出即可
再次执行编译命令

make

这次进度比之前多,但是仍然报错中断

In file included from /tmp/wakaama/tests/block1tests.c:19:
/tmp/wakaama/tests/tests.h:21:10: fatal error: CUnit/CUError.h: No such file or directory
   21 | #include "CUnit/CUError.h"
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [tests/CMakeFiles/lwm2munittests.dir/build.make:76: tests/CMakeFiles/lwm2munittests.dir/block1tests.c.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:372: tests/CMakeFiles/lwm2munittests.dir/all] Error 2
make: *** [Makefile:101: all] Error 2

根据网上大多文章都让去下载 Cunit 源码然后 cmake 编译来解决,非常麻烦。
这里我询问了当前大火的人工智能 chatGPT,看看机器人是怎么解决的:
在这里插入图片描述
非常清晰、明了、简单,直接安装缺失的库即可

apt-get install libcunit1 libcunit1-doc libcunit1-dev

再次执行编译即可通过

make
...
[ 98%] Building C object tests/CMakeFiles/lwm2munittests.dir/__/examples/shared/commandline.c.o
[ 99%] Building C object tests/CMakeFiles/lwm2munittests.dir/__/examples/shared/memtrace.c.o
[ 99%] Building C object tests/CMakeFiles/lwm2munittests.dir/__/examples/shared/platform.c.o
[100%] Building C object tests/CMakeFiles/lwm2munittests.dir/__/examples/shared/connection.c.o
[100%] Linking C executable lwm2munittests
[100%] Built target lwm2munittests
2.4 验证编译结果

进入 example/client 目录下,可以执行客户端程序,编译成功。

root@0c28a21cddfa:/tmp/wakaama/build# ls
CMakeCache.txt  CMakeFiles  CTestTestfile.cmake  Makefile  cmake_install.cmake  examples  tests
root@0c28a21cddfa:/tmp/wakaama/build#
root@0c28a21cddfa:/tmp/wakaama/build# cd examples/
root@0c28a21cddfa:/tmp/wakaama/build/examples# ls
CMakeFiles  Makefile  bootstrap_server  client  cmake_install.cmake  lightclient  server
root@0c28a21cddfa:/tmp/wakaama/build/examples#
root@0c28a21cddfa:/tmp/wakaama/build/examples# cd client/
root@0c28a21cddfa:/tmp/wakaama/build/examples/client# ls
CMakeFiles  Makefile  cmake_install.cmake  external_tinydtls-prefix  lwm2mclient  lwm2mclient_tinydtls
root@0c28a21cddfa:/tmp/wakaama/build/examples/client#
root@0c28a21cddfa:/tmp/wakaama/build/examples/client# ./lwm2mclient
Trying to bind LWM2M Client to port 56830
LWM2M Client "testlwm2mclient" started on port 56830
> Opening connection to server at ::1:5683
Connection creation failed.

猜你喜欢

转载自blog.csdn.net/qq12547345/article/details/128397334