16 如何在 Windows 上编译 ag_driver

16.1 概述

这里的编译说明,针对 ag_driver 的两个部分。

  • 示例程序,包括 demo_onlinedemo_pcap

  • 点云显示工具 ag_driver_viewer

两者对第三方库的依赖不同,这里将分开说明。

如下步骤在 Windows 10 系统下完成,使用的编译工具为 VS2019。(若使用不同版本VS,如VS2022,请注意配置属性->常规->平台工具集是否正确)

16.2 编译 demo_online

演示程序的编译,以 demo_online 为例说明。demo_pcap 的编译步骤与 demo_online 相同。

16.2.1 安装第三方库

  • 如果需要解析 PCAP 文件,则需要安装 libpcap 库,包括:

    • WpdPack_4_1_2.zip, 编译时需要的头文件和库文件

    • WinPcap_4_1_3.exe, 包括运行时库

  • WpdPack_4_1_2.zip 解压到目录 C:/Program Files 下。

  • 运行 WinPcap_4_1_3.exe,安装到目录 C:/Program Files 下。

16.2.2 创建 demo_online 工程

创建 demo_online 工程,加入源文件 demo_online.cpp

../../_images/16_01_demo_project.png

16.2.3 配置 demo_online 工程

  • 设置和编译时一定要注意编译器是否为 X64,也要注意区分 DEBUG/RELEASE

  • 遵循 C++14 标准。(注意平台工具集是否符合 VS 版本) ../../_images/16_02_demo_use_cpp14.png

  • C/C++ -> 常规->附加包含目录:demo_online 当然依赖 ag_driver 库。设置 ag_driver 的头文件路径。(以源文件为对象的相对路径) ../../_images/16_03_demo_extra_include.png

  • VC++目录 -> 包含目录:设置 libpcap 库的头文件路径(例如 C:\Program Files\WpdPack_4_1_2\WpdPack\Include)。 ../../_images/16_04_demo_include_path.png

  • VC++目录 -> 包含目录:设置 libpcap 库的库文件路径(例如 C:\Program Files\WpdPack_4_1_2\WpdPack\Lib\x64)。 ../../_images/16_05_demo_lib_path.png

  • 链接器 -> 输入 -> 附加依赖库:设置依赖的 libpcapwpcap.lib。也同时设置 ws2_32.lib,这是 Windows 的 socket 库,ag_driver 依赖它。 ../../_images/16_06_demo_lib.png

  • C/C++ -> 预处理 -> 预处理器定义:设置编译选项 _CRT_SECURE_NO_WARNINGS,避免不必要的编译错误。 ../../_images/16_07_demo_precompile_macro.png

16.2.4 编译及运行

  • 编译 demo_online 工程,并运行。

    这个步骤没有什么特别的。

16.3 编译 ag_driver_viewer

16.3.1 安装第三方库

demo_online 一样,安装 libpcap 库。

ag_driver_viewer 还依赖 PCL 库,后者又依赖 BoostEigen 等一系列库。幸运的是,PCL 库提供了适配 MSVC2019 的安装包,而这个包中又自带了它所依赖的库。这里使用的安装包是 PCL-1.11.1-AllInOne-msvc2019-win64.exe。

运行它,安装到目录 C:/Program Files 下。

../../_images/16_08_viewer_install_pcl.png

注意,安装 PCL 库的同时,也会安装它依赖的库。(在过程中可能会弹出路径长度不够的提示,不用管他,直接 OK 或者关掉,自动会把 OpenNI2 放 PCL 的同级)

../../_images/16_09_viewer_install_pcl_dep.png

安装的组件位置如下:

C:\Program Files\PCL 1.11.1          # PCL自身的库
C:\Program Files\OpenNI2             # PCL依赖的OpenNI2库
C:\Program Files\PCL 1.11.1\3rdParty # PCL依赖的其他库

16.3.2 配置第三方库

将如下运行时库的路径加入 PATH

../../_images/16_10_viewer_add_env_var.png

C:\Program Files\PCL 1.11.1\bin
C:\Program Files\PCL 1.11.1\3rdParty\VTK\bin
C:\Program Files\PCL 1.11.1\3rdParty\OpenNI2\Redist

16.3.3 创建 ag_driver_viewer 工程

创建 ag_driver_viewer 工程,加入源文件 ag_driver_viewer.cpp

../../_images/16_11_viewer_project.png

16.3.4 配置 ag_driver_viewer 工程

1、与 demo_online 一样,遵循 C++14 标准

../../_images/16_02_demo_use_cpp14.png

2、禁止 SDL 检查

../../_images/16_12_viewer_sdl_check.png

3、C/C++ -> 常规 -> 附加包含目录:与 demo_online 一样,设置 ag_driver 的头文件路径。(以源文件为对象的相对路径)

../../_images/16_03_demo_extra_include.png

4、VC++目录 -> 包含目录:设置 PCL 库的头文件路径如下。(不要忘了也要与 demo_online 一样,同时设置 libpcap 库)

../../_images/16_13_viewer_include_path.png

C:\Program Files\PCL 1.11.1\include\pcl-1.11
C:\Program Files\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
C:\Program Files\PCL 1.11.1\3rdParty\Eigen\eigen3
C:\Program Files\PCL 1.11.1\3rdParty\FLANN\include
C:\Program Files\PCL 1.11.1\3rdParty\Qhull\include
C:\Program Files\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
C:\Program Files\OpenNI2\Include

5、VC++目录 -> 库目录:设置 PCL 库的库文件路径。(不要忘了也要与 demo_online 一样,同时设置 libpcap

../../_images/16_14_viewer_lib_path.png

C:\Program Files\PCL 1.11.1\lib
C:\Program Files\PCL 1.11.1\3rdParty\Boost\lib
C:\Program Files\PCL 1.11.1\3rdParty\FLANN\lib
C:\Program Files\PCL 1.11.1\3rdParty\Qhull\lib
C:\Program Files\PCL 1.11.1\3rdParty\VTK\lib
C:\Program Files\OpenNI2\Lib

6、链接器 -> 输入 -> 附加依赖库:设置 PCL 及它依赖的库,包括 PCLvtk 两部分。

注意:两者都分为 debug/release 版本,添加时一定要注意区分。如下是 debug 版本。这里的步骤以 debug 版本举例。(不要忘了也要与demo_online一样,同时设置wpcap.libws2_32.lib

PCL 的库文件,如下是 debug 版本:

pcl_commond.lib
pcl_featuresd.lib
pcl_filtersd.lib
pcl_iod.lib
pcl_io_plyd.lib
pcl_kdtreed.lib
pcl_keypointsd.lib
pcl_mld.lib
pcl_octreed.lib
pcl_outofcored.lib
pcl_peopled.lib
pcl_recognitiond.lib
pcl_registrationd.lib
pcl_sample_consensusd.lib
pcl_searchd.lib
pcl_segmentationd.lib
pcl_stereod.lib
pcl_surfaced.lib
pcl_trackingd.lib
pcl_visualizationd.lib

vtk 库,如下是 debug 版本:

vtkChartsCore-8.2-gd.lib
vtkCommonColor-8.2-gd.lib
vtkCommonComputationalGeometry-8.2-gd.lib
vtkCommonCore-8.2-gd.lib
vtkCommonDataModel-8.2-gd.lib
vtkCommonExecutionModel-8.2-gd.lib
vtkCommonMath-8.2-gd.lib
vtkCommonMisc-8.2-gd.lib
vtkCommonSystem-8.2-gd.lib
vtkCommonTransforms-8.2-gd.lib
vtkDICOMParser-8.2-gd.lib
vtkDomainsChemistry-8.2-gd.lib
vtkDomainsChemistryOpenGL2-8.2-gd.lib
vtkdoubleconversion-8.2-gd.lib
vtkexodusII-8.2-gd.lib
vtkexpat-8.2-gd.lib
vtkFiltersAMR-8.2-gd.lib
vtkFiltersCore-8.2-gd.lib
vtkFiltersExtraction-8.2-gd.lib
vtkFiltersFlowPaths-8.2-gd.lib
vtkFiltersGeneral-8.2-gd.lib
vtkFiltersGeneric-8.2-gd.lib
vtkFiltersGeometry-8.2-gd.lib
vtkFiltersHybrid-8.2-gd.lib
vtkFiltersHyperTree-8.2-gd.lib
vtkFiltersImaging-8.2-gd.lib
vtkFiltersModeling-8.2-gd.lib
vtkFiltersParallel-8.2-gd.lib
vtkFiltersParallelImaging-8.2-gd.lib
vtkFiltersPoints-8.2-gd.lib
vtkFiltersProgrammable-8.2-gd.lib
vtkFiltersSelection-8.2-gd.lib
vtkFiltersSMP-8.2-gd.lib
vtkFiltersSources-8.2-gd.lib
vtkFiltersStatistics-8.2-gd.lib
vtkFiltersTexture-8.2-gd.lib
vtkFiltersTopology-8.2-gd.lib
vtkFiltersVerdict-8.2-gd.lib
vtkfreetype-8.2-gd.lib
vtkGeovisCore-8.2-gd.lib
vtkgl2ps-8.2-gd.lib
vtkglew-8.2-gd.lib
vtkGUISupportMFC-8.2-gd.lib
vtkhdf5-8.2-gd.lib
vtkhdf5_hl-8.2-gd.lib
vtkImagingColor-8.2-gd.lib
vtkImagingCore-8.2-gd.lib
vtkImagingFourier-8.2-gd.lib
vtkImagingGeneral-8.2-gd.lib
vtkImagingHybrid-8.2-gd.lib
vtkImagingMath-8.2-gd.lib
vtkImagingMorphological-8.2-gd.lib
vtkImagingSources-8.2-gd.lib
vtkImagingStatistics-8.2-gd.lib
vtkImagingStencil-8.2-gd.lib
vtkInfovisCore-8.2-gd.lib
vtkInfovisLayout-8.2-gd.lib
vtkInteractionImage-8.2-gd.lib
vtkInteractionStyle-8.2-gd.lib
vtkInteractionWidgets-8.2-gd.lib
vtkIOAMR-8.2-gd.lib
vtkIOAsynchronous-8.2-gd.lib
vtkIOCityGML-8.2-gd.lib
vtkIOCore-8.2-gd.lib
vtkIOEnSight-8.2-gd.lib
vtkIOExodus-8.2-gd.lib
vtkIOExport-8.2-gd.lib
vtkIOExportOpenGL2-8.2-gd.lib
vtkIOExportPDF-8.2-gd.lib
vtkIOGeometry-8.2-gd.lib
vtkIOImage-8.2-gd.lib
vtkIOImport-8.2-gd.lib
vtkIOInfovis-8.2-gd.lib
vtkIOLegacy-8.2-gd.lib
vtkIOLSDyna-8.2-gd.lib
vtkIOMINC-8.2-gd.lib
vtkIOMovie-8.2-gd.lib
vtkIONetCDF-8.2-gd.lib
vtkIOParallel-8.2-gd.lib
vtkIOParallelXML-8.2-gd.lib
vtkIOPLY-8.2-gd.lib
vtkIOSegY-8.2-gd.lib
vtkIOSQL-8.2-gd.lib
vtkIOTecplotTable-8.2-gd.lib
vtkIOVeraOut-8.2-gd.lib
vtkIOVideo-8.2-gd.lib
vtkIOXML-8.2-gd.lib
vtkIOXMLParser-8.2-gd.lib
vtkjpeg-8.2-gd.lib
vtkjsoncpp-8.2-gd.lib
vtklibharu-8.2-gd.lib
vtklibxml2-8.2-gd.lib
vtklz4-8.2-gd.lib
vtklzma-8.2-gd.lib
vtkmetaio-8.2-gd.lib
vtkNetCDF-8.2-gd.lib
vtkogg-8.2-gd.lib
vtkParallelCore-8.2-gd.lib
vtkpng-8.2-gd.lib
vtkproj-8.2-gd.lib
vtkpugixml-8.2-gd.lib
vtkRenderingAnnotation-8.2-gd.lib
vtkRenderingContext2D-8.2-gd.lib
vtkRenderingContextOpenGL2-8.2-gd.lib
vtkRenderingCore-8.2-gd.lib
vtkRenderingExternal-8.2-gd.lib
vtkRenderingFreeType-8.2-gd.lib
vtkRenderingGL2PSOpenGL2-8.2-gd.lib
vtkRenderingImage-8.2-gd.lib
vtkRenderingLabel-8.2-gd.lib
vtkRenderingLOD-8.2-gd.lib
vtkRenderingOpenGL2-8.2-gd.lib
vtkRenderingVolume-8.2-gd.lib
vtkRenderingVolumeOpenGL2-8.2-gd.lib
vtksqlite-8.2-gd.lib
vtksys-8.2-gd.lib
vtktheora-8.2-gd.lib
vtktiff-8.2-gd.lib
vtkverdict-8.2-gd.lib
vtkViewsContext2D-8.2-gd.lib
vtkViewsCore-8.2-gd.lib
vtkViewsInfovis-8.2-gd.lib
vtkzlib-8.2-gd.lib

7、C/C++ -> 预处理 -> 预处理器定义:设置如下编译选项,避免不必要的编译错误。(记得要与 demo_online 一样,设置 _CRT_SECURE_NO_WARNINGS 选项)

../../_images/16_16_viewer_precompile_macro.png

BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE

16.3.5 编译及运行

编译 ag_driver_viewer 工程,并运行。对于运行这类需要输入参数的,可直接在项目的属性列表 调试->命令参数 中添加,如 -type A0 -msop 51180

16.3.6 若需要使用其他版本的 PCL、VTK

若需要使用其他版本的 PCL 和 VTK,那么在填写依赖库文件时,会有大量的文件名需要获取,以及 debug/release 版本需要区分。建议使用 bat 脚本的方式获取,如下。

@echo off
for %%I in (*.lib) do echo %%I>>all.txt
for %%I in (*d.lib) do echo %%I>>adebug.txt
for %%I in (*8.2.lib) do echo %%I>>arelease.txt
pause

根据需求修改匹配的版本号,将该 bat 脚本放置在库文件内运行即可。