windows 10 系统LCM通信库的编译

时间:2024-05-30 18:48:10

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个包,我们下载红圈中的两个包。
windows 10 系统LCM通信库的编译
当然也可以直接在我的百度云下载。后来我发现我使用的这个glib是win32版本的,但是可以用,没有什么问题,而且我们只是使用里面的几个文件而已。当然,也可以尝试使用win64版本

1.3 MSYS2 小系统

下载MSYS2小系统,并安装。我将之安装到了D:\MSYS64目录下。
目录结构如下:
windows 10 系统LCM通信库的编译

1.4 cmake准备

下载Cmake,并解压,放到D:\cmake路径下。
目录结构如下:
windows 10 系统LCM通信库的编译

1.5 Python下载安装

确保电脑中安装了Python,哪个版本无所谓,我使用的是python3.7,安装在了D:\Program Files\Python目录下

1.6 VS2017安装

安装VS2017 ,如果不用这个版本,VS2008,2010,2012。。。等等版本,据我估计应该也是没得问题的。

2. 环境变量准备

  1. Python的安装路径D:\Program Files\Python添加到环境变量;
  2. Python的Script路径D:\Program Files\Python\Scripts添加到环境变量;
  3. MSYS2的bin路径D:\MSYS64\mingw64\bin添加到环境变量;
  4. cmake的bin路径D:\cmake\bin添加到环境变量;

重启电脑。
打开cmd:
输入python,显示如下表示python路径设置安装成功:
windows 10 系统LCM通信库的编译

输入cmake,显示如下表示cmake路径设置安装成功:
windows 10 系统LCM通信库的编译
输入gcc,显示如下表示MSYS2路径设置安装成功:
windows 10 系统LCM通信库的编译

3. Glib的安装

3.1 换源

进入到MSYS2的安装目录中的D:\MSYS64\etc\pacman.d,发现有下面三个文件:
windows 10 系统LCM通信库的编译
将三个文件另存备份,替换为这里下载的三个文件。这样就换到了中科大的源,速度比较快。

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盘,那就就是:
windows 10 系统LCM通信库的编译
输入:

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"

windows 10 系统LCM通信库的编译
然后会在build文件夹下生成一个lcm.sln文件。
windows 10 系统LCM通信库的编译

双击打开该lcm.sln得到下图。
windows 10 系统LCM通信库的编译

4.2 修复bug

  1. 添加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

  1. 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>
  1. 修改python的pyconfig.h
    在Python的安装目录中D:\Program Files\Python\include找到pyconfig.h文件,将文件中的define Py_DEBUG注释掉,如下图
    windows 10 系统LCM通信库的编译

并且将下图中的python37_d.lib改为python37.lib
windows 10 系统LCM通信库的编译

这样,在debug/x64 模式下运行,会弹出
windows 10 系统LCM通信库的编译
没关系,这不影响,
打开..\lcm-master\build\lcm\Debug会发现,生成了:
windows 10 系统LCM通信库的编译

lcm.dll已经生成。
当然如果是release 模式,也会在release模式对应的文件夹下生成对应的release模式的lcm.dll

4.3 测试是否可用

将下面的文件:
windows 10 系统LCM通信库的编译
放在..\lcm-master\build\\liblcm-test文件夹下,在VS2017 中,右键lcm-example,设为启动项,点击运行:得到
windows 10 系统LCM通信库的编译
说明没有问题,生成的库文件可以使用。

参考资料:

  1. https://github.com/lcm-proj/lcm/issues/99
  2. https://blog.****.net/10km/article/details/80399355
  3. https://blog.****.net/weixinhum/article/details/81354061
  4. https://blog.****.net/liyuanbhu/article/details/56496501