首先,什么是LCM?
简而言之,是一个UDP传输方案。也就是在UDP外围做了一层封装,使得数据的传输变得比较的方便。
其次,一般在什么环境下用LCM?
在无人车系统中。而且操作系统多为linux,因此在linux编译这玩意据说有种水到渠成的感觉。
最后,为什么要在windows下来搞这套东西,而且又要在32搞定的情况下在64位上再搞一遍?
我不告诉你。
因为应用场景比较小众,估计这注定是一篇浏览量很悲剧的文章。然而哪怕只有一个人用到,这篇文章也有意义,因为网上的中文材料关于64位编译LCM这部分可以说是空白的,英文材料也很少,因此估计能帮你节省下少则一天,多则一月的时间。
废话就说到这,下面上流程:
参考网站:https://github.com/lcm-proj/lcm/issues/99(这个网页几乎包含能参考的所有信息,请无论如何先仔细看一遍)
安装python(64位版本)
地址:https://www.python.org/downloads/release/python-2715/
本人装的是2.7.15版本
装完之后添加环境变量
PYTHONPATH=C:\Python27;C:\Python27\Scripts;C:\Python27\Lib;C:\Python27\DLLs;C:\Python27\Lib\lib-tk;(注意这里是你安装Python的实际位置)
把PYTHONPATH环境变量添加到Path环境变量中,即
Path=%PYTHONPATH%
弄完之后可以在控制台输入python测试下是不是成功配置了。
到此关于Python相关的配置就完成了。
下载安装CMake
地址:https://cmake.org/download/
弄完后把bin文件夹也添加进环境变量Path中,也同样可以在控制台输入CMake测试下:
下载并安装MSYS2(小型GNU环境,为后面使用GCC编译glib2做平台性质的准备)
地址:http://www.msys2.org/
先换源(速度从龟速到正常),具体参考下面博客:https://blog.csdn.net/liyuanbhu/article/details/56496501
环境初始化,参考下面博客(本人感觉不做应该也可以,有勇士请验证下):
https://blog.csdn.net/yehuohan/article/details/52090282
因为后面就用到mingw-w64,因此直接安装mingw-w64的环境包
pacman -S mingw-w64-x86_64-toolchain
安装glib2
pacman -S glib2 glib2-devel mingw-w64-x86_64-glib2
下载LCM源码包,地址:https://github.com/lcm-proj/lcm
在github文件夹下载的源码包下新建一个叫做build的文件夹。
用管理员权限打开控制台然后cd到这里,输入下面的命令(本人要编译的是VS2017的64位版本,因此命令写为“Visual Studio 15 2017 Win64”,这里请做相应修改。另外,具体路径也要做修改)
cmake .. -G"Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release -DLCM_ENABLE_TESTS=OFF -DCMAKE_INSTALL_PREFIX=../build -DGLIB2_GLIBCONFIG_INCLUDE_DIR="E:\lcm\msys64\mingw64\lib\glib-2.0\include" -DGLIB2_GLIB_INCLUDE_DIR="E:\lcm\msys64\mingw64\include\glib-2.0" -DGLIB2_GLIB_LIBRARY="E:\lcm\msys64\mingw64\lib\libglib-2.0.dll.a" -DGLIB2_GLIB_RUNTIME="E:\lcm\msys64\mingw64\bin\libglib-2.0.dll"
完成上面一步会在build文件夹下生成VS的文件,打开"lcm.sln",直接编译,发现出现了大量的错误。
可以发现都跟"mswsock.h"这个文件相关,看文件位置发现其是系统相关文件,不应该出错,因此猜测是头文件的相互包含出错。定位到包含该头文件的地方,发现只有“WinPorting.cpp”包含该文件。
相关程序段如下:
#define _WIN32_WINNT 0x0501
#include <Mswsock.h>
#include <stdio.h>
#include <winsock2.h>
修改为:
#define _WIN32_WINNT 0x0501
#include <winsock2.h>
#include <Mswsock.h>
#include <stdio.h>
再次编译,主体OK了。
残留问题如下:
因为是跟go相关的东西,没有用到,所以本人选择了无视,如果需要处理,下面这个文章能解决第一个问题,
https://blog.csdn.net/sinat_36053757/article/details/68487662?locationNum=3&fps=1
至于F_OK这个问题,参考网址如下:
https://blog.csdn.net/u012005313/article/details/50688257
就是在相应的位置把加上。
#define F_OK 0
就可以了
完成编译之后,可以将工程里面的“lcm-example”设为启动项,然后把下面的dll扔进“liblcm-test”目录,然后运行即可看到结果
另外写文章累人,写代码掉头发,如果觉得文章有帮助,哈哈哈