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-*.logmake[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 directory21 | #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.