LCM是Lightweight Communications and Marshalling 的简称,是一个轻量级的通信与编组库。LCM内部封装了UDP,可以满足实时系统通信中高带宽,低延迟的要求。一般情况下,LCM在Ubuntu等Linux系统中使用的比较多,但是由于一些 众所不知的原因,我决定在Windows 10 64bit系统下搞一搞这个东西。
1. 资源准备
1.1 LCM下载
我下载的1.4.0版本的包:GitHub下载;或者在我的百度云下载。这个版本相较于之前的版本更加容易编译一些。
1.2 Glib下载
Glib下载2.28版本,一共两个包:下载链接点击计入2.28那个版本,看到下图中所示的4个包,我们下载红圈中的两个包。
当然也可以直接在我的百度云下载。后来我发现我使用的这个glib是win32版本的,但是可以用,没有什么问题,而且我们只是使用里面的几个文件而已。当然,也可以尝试使用win64版本。
1.3 MSYS2 小系统
下载MSYS2小系统,并安装。我将之安装到了D:\MSYS64
目录下。
目录结构如下:
1.4 cmake准备
下载Cmake,并解压,放到D:\cmake
路径下。
目录结构如下:
1.5 Python下载安装
确保电脑中安装了Python,哪个版本无所谓,我使用的是python3.7,安装在了D:\Program Files\Python
目录下
1.6 VS2017安装
安装VS2017 ,如果不用这个版本,VS2008,2010,2012。。。等等版本,据我估计应该也是没得问题的。
2. 环境变量准备
- Python的安装路径
D:\Program Files\Python
添加到环境变量; - Python的Script路径
D:\Program Files\Python\Scripts
添加到环境变量; - MSYS2的bin路径
D:\MSYS64\mingw64\bin
添加到环境变量; - cmake的bin路径
D:\cmake\bin
添加到环境变量;
重启电脑。
打开cmd:
输入python,显示如下表示python路径设置安装成功:
输入cmake,显示如下表示cmake路径设置安装成功:
输入gcc,显示如下表示MSYS2路径设置安装成功:
3. Glib的安装
3.1 换源
进入到MSYS2的安装目录中的D:\MSYS64\etc\pacman.d
,发现有下面三个文件:
将三个文件另存备份,替换为这里下载的三个文件。这样就换到了中科大的源,速度比较快。
3.2 安装Glib
打开msys2窗口,输入:
pacman -S mingw-w64-x86_64-toolchain
然后输入
pacman -S glib2 glib2-devel mingw-w64-x86_64-glib2
等待安装完毕。
注意到,我们这里安装的Glib是2.54版本,(或者更高的版本。。。)。
3.3 Gib合并
接下来是一件比较麻烦的事,要把我们现在安装的Glib2.54版本和刚刚下载的Glib2.28版本整合在一起。这样做的原因是Glib2.54默认安装到了MSYS2 的路径下,在后面的编译中,总是找不到一些文件,所以我们要将其整理合并,放在一个比较好找的路径之下。
首先在MSYS2 的安装路径之下(包括其子目录中),找到下述结构中所示的文件,并按照下述结构整理到一个新建的Glib文件夹中
glib
├── bin
│ ├── gdbus.exe
│ ├── gdbus-codegen.exe
│ ├── gio.exe
│ ├── gio-querymodules.exe
│ ├── glib-compile-resources.exe
│ ├── glib-compile-schemas.exe
│ ├── glib-genmarshal.exe
│ ├── glib-genmarshal-script.py
│ ├── glib-gettextize.文件
│ ├── glib-mkenums.exe
│ ├── glib-mkenums-script.py
│ ├── gobject-query.exe
│ ├── gresource.exe
│ ├── gsettings.exe
│ ├── gspawn-win64-helper.exe
│ ├── gspawn-win64-helper-console.exe
│ ├── libgio-2.0-0.dll
│ ├── libglib-2.0-0.dll
│ ├── libgmodule-2.0-0.dll
│ ├── libgobject-2.0-0.dll
│ └── libgthread-2.0-0.dll
├── include
│ ├── gio-win32-2.0
│ │ ├── gio
│ │ │ ├── gwin32inputstream.h
│ │ │ └──gwin32outputstream
│ └── glib-2.0
│ ├── gio文件夹
│ ├── glib文件夹
│ ├── gobject文件夹
│ ├── glib.h
│ ├── glibconfig.h
│ ├── glib-object.h
│ ├── glib-unix.h
│ ├── gmodule.h
│ └── msvc_recommended_pragmas.h
├── lib
│ ├── glib-2.0文件夹
│ ├── pkgconfig文件夹
│ ├── gio-2.0.def
│ ├── gio-2.0.lib
│ ├── glib-2.0.def
│ ├── glib-2.0.lib
│ ├── gmodule-2.0.def
│ ├── gmodule-2.0.lib
│ ├── gobject-2.0.def
│ ├── gobject-2.0.lib
│ ├── gthread-2.0.def
│ ├── gthread-2.0.lib
│ ├── libgio-2.0.a
│ ├── libgio-2.0.dll.a
│ ├── libglib-2.0.a
│ ├── libglib-2.0.dll.a
│ ├── libgmodule-2.0.a
│ ├── libgmodule-2.0.dll.a
│ ├── libgobject-2.0.a
│ ├── libgobject-2.0.dll.a
│ ├── libgthread-2.0.a
│ └── libgthread-2.0.dll.a
└── share
├── aclocal文件夹
├── bash-completion文件夹
├── gdb文件夹
├── gettext文件夹
├── glib-2.0文件夹
└── locale文件夹
上述glib\lib
中的.def
和.lib
文件不能再MSYS2目录下找到,所以我们将之前下载的glib-dev_2.28.8-1_win32\lib
中的对应同名文件复制粘贴进去。
还有一点是glib\include\glib-2.0\glibconfig.h
是从glib\lib\glib-2.0\include\glibconfig.h
复制过去的。
不想麻烦直接下载我配置完全的也可以。
我把配置完全的glib文件夹放在了D盘。
4. 编译LCM
4.1 生成sln工程
解压lcm-1.4.0压缩包,得到文件夹lcm-master,在该文件夹下面新建文件夹build,并在cmd下进入到该目录。比如我将文件夹lcm-master放在D盘,那就就是:
输入:
cmake .. -G"Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Release -DLCM_ENABLE_TESTS=OFF -DCMAKE_INSTALL_PREFIX=../build -DGLIB2_GLIBCONFIG_INCLUDE_DIR="D:\glib\lib\glib-2.0\include" -DGLIB2_GLIB_INCLUDE_DIR="D:\glib\include\glib-2.0" -DGLIB2_GLIB_LIBRARY="D:\glib\lib\libglib-2.0.dll.a" -DGLIB2_GLIB_RUNTIME="D:\glib\bin\libglib-2.0-0.dll"
然后会在build文件夹下生成一个lcm.sln文件。
双击打开该lcm.sln得到下图。
4.2 修复bug
- 添加
unistd.h
文件
新建一个文件,粘贴下面的内容,并保存为unistd.h
/** This file is part of the Mingw32 package.
2. unistd.h maps (roughly) to io.h
*/
#define F_OK 0
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
将文件unistd.h
放在..\lcm-master\lcmgen
中
- Li
在..\lcm-master\lcm\windows
中,找到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>
- 修改python的pyconfig.h
在Python的安装目录中D:\Program Files\Python\include
找到pyconfig.h
文件,将文件中的define Py_DEBUG
注释掉,如下图
并且将下图中的python37_d.lib
改为python37.lib
这样,在debug/x64 模式下运行,会弹出
没关系,这不影响,
打开..\lcm-master\build\lcm\Debug
会发现,生成了:
lcm.dll
已经生成。
当然如果是release 模式,也会在release模式对应的文件夹下生成对应的release模式的lcm.dll
4.3 测试是否可用
将下面的文件:
放在..\lcm-master\build\\liblcm-test
文件夹下,在VS2017 中,右键lcm-example
,设为启动项,点击运行:得到
说明没有问题,生成的库文件可以使用。