# 16 如何在 Windows 上编译 ag_driver ## 16.1 概述 这里的编译说明,针对 `ag_driver` 的两个部分。 - 示例程序,包括 `demo_online` 和 `demo_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`。 ![](./img/16_01_demo_project.png) ### 16.2.3 配置 demo_online 工程 - 设置和编译时一定要注意编译器是否为 X64,也要注意区分 DEBUG/RELEASE - 遵循 `C++14` 标准。(注意平台工具集是否符合 VS 版本) ![](./img/16_02_demo_use_cpp14.png) - C/C++ -> 常规->附加包含目录:`demo_online` 当然依赖 `ag_driver` 库。设置 `ag_driver` 的头文件路径。(以源文件为对象的相对路径) ![](./img/16_03_demo_extra_include.png) - VC++目录 -> 包含目录:设置 `libpcap` 库的头文件路径(例如 `C:\Program Files\WpdPack_4_1_2\WpdPack\Include`)。 ![](./img/16_04_demo_include_path.png) - VC++目录 -> 包含目录:设置 `libpcap` 库的库文件路径(例如 `C:\Program Files\WpdPack_4_1_2\WpdPack\Lib\x64`)。 ![](./img/16_05_demo_lib_path.png) - 链接器 -> 输入 -> 附加依赖库:设置依赖的 `libpcap` 库 `wpcap.lib`。也同时设置 `ws2_32.lib`,这是 Windows 的 socket 库,`ag_driver` 依赖它。 ![](./img/16_06_demo_lib.png) - C/C++ -> 预处理 -> 预处理器定义:设置编译选项 `_CRT_SECURE_NO_WARNINGS`,避免不必要的编译错误。 ![](./img/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` 库,后者又依赖 `Boost`、`Eigen` 等一系列库。幸运的是,`PCL` 库提供了适配 `MSVC2019` 的安装包,而这个包中又自带了它所依赖的库。这里使用的安装包是 PCL-1.11.1-AllInOne-msvc2019-win64.exe。 运行它,安装到目录 `C:/Program Files` 下。 ![](./img/16_08_viewer_install_pcl.png) 注意,安装 `PCL` 库的同时,也会安装它依赖的库。(在过程中可能会弹出路径长度不够的提示,不用管他,直接 OK 或者关掉,自动会把 OpenNI2 放 PCL 的同级) ![](./img/16_09_viewer_install_pcl_dep.png) 安装的组件位置如下: ```bash 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`。 ![](./img/16_10_viewer_add_env_var.png) ```bash 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`。 ![](./img/16_11_viewer_project.png) ### 16.3.4 配置 ag_driver_viewer 工程 1、与 `demo_online` 一样,遵循 `C++14` 标准 ![](./img/16_02_demo_use_cpp14.png) 2、禁止 SDL 检查 ![](./img/16_12_viewer_sdl_check.png) 3、C/C++ -> 常规 -> 附加包含目录:与 `demo_online` 一样,设置 `ag_driver` 的头文件路径。(以源文件为对象的相对路径) ![](./img/16_03_demo_extra_include.png) 4、VC++目录 -> 包含目录:设置 `PCL` 库的头文件路径如下。(不要忘了也要与 `demo_online` 一样,同时设置 `libpcap` 库) ![](./img/16_13_viewer_include_path.png) ```bash 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`) ![](./img/16_14_viewer_lib_path.png) ```bash 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` 及它依赖的库,包括 `PCL` 和 `vtk` 两部分。 **注意**:两者都分为 `debug`/`release` 版本,添加时一定要注意区分。如下是 `debug` 版本。这里的步骤以 `debug` 版本举例。(不要忘了也要与`demo_online`一样,同时设置`wpcap.lib`和`ws2_32.lib`) `PCL` 的库文件,如下是 `debug` 版本: ```bash 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` 版本: ```bash 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` 选项) ![](./img/16_16_viewer_precompile_macro.png) ```bash 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 脚本的方式获取,如下。 ```basic @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 脚本放置在库文件内运行即可。