博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pcl dll load failed: 找不到指定的模块。_Python-PCL编译问题 终极解决方案
阅读量:4319 次
发布时间:2019-06-06

本文共 7357 字,大约阅读时间需要 24 分钟。

9ea4ff3716970d5d257f016233a14077.png

这篇文章总结了python-pcl编译过程中可能遇到的各种坑, 以及可行的解决方案.

python-pcl正常的编译参考github repo的文档strawlab/python-pcl

问题类型1 编译过程中出现 fatal error: vtkObjectBase.h: No such file or directory

这是由于python-pcl本身的bug导致的. python-pcl默认vtk是安装在/usr/lib下, 因此它就把查找vtk的头文件和库文件的路径写死在setup.py里了;

但是, 大多数人在编译pcl(原生c++版本)的时候, 都是按照官网教程, 把vtk安装到/usr/local/lib里(或者其他的某些你自己指定的路径下), 这个时候setup.py找不到vtk就会报上边的这个错误.

解决方法:

修改setup.py, 找到https://github.com/strawlab/python-pcl/blob/1d83d2d7ce9ce2c22ff5855249459bfc22025000/setup.py#L729 这几行 (这里以pcl 1.8为例, 具体改哪个if分支要按照你本机上的pcl版本决定),

假如你的vtk的库文件安装到了/usr/local/lib中, 头文件安装到了/usr/local/include中, 那么就把原来的

elif pcl_version == '-1.8':            # pcl 1.8.0/1?(Ubuntu 18.04)(melodic)            vtk_version = '7.0'            # pcl 1.8.1?            # vtk_version = '8.0'            vtk_include_dir = os.path.join('/usr/include/vtk-' + vtk_version)            vtk_library_dir = os.path.join('/usr/lib')

改成

elif pcl_version == '-1.8':            # pcl 1.8.0/1?(Ubuntu 18.04)(melodic)            vtk_version = '7.0'            # pcl 1.8.1?            # vtk_version = '8.0'            # 改下边这两个路径            vtk_include_dir = os.path.join('/usr/local/include/vtk-' + vtk_version)            vtk_library_dir = os.path.join('/usr/local/lib')

然后重新编译python-pcl即可.

问题类型2 编译过程中出现 cannot find -lvtk XXXXXXXXX

问题表现为, 在编译快结束的链接过程中, 出现以下链接错误并编译失败(注意后边的-7.0可能是8.0或者其他版本号, 取决于你本机环境).

cannot find -lvtkalglib-7.0cannot find -lvtkChartsCore-7.0cannot find -lvtkCommonColor-7.0cannot find -lvtkCommonComputationalGeometry-7.0cannot find -lvtkCommonCore-7.0cannot find -lvtkCommonDataModel-7.0cannot find -lvtkCommonExecutionModel-7.0cannot find -lvtkCommonMath-7.0cannot find -lvtkCommonMisc-7.0cannot find -lvtkCommonSystem-7.0cannot find -lvtkCommonTransforms-7.0cannot find -lvtkDICOMParser-7.0cannot find -lvtkDomainsChemistry-7.0cannot find -lvtkexoIIc-7.0cannot find -lvtkexpat-7.0cannot find -lvtkFiltersAMR-7.0cannot find -lvtkFiltersCore-7.0cannot find -lvtkFiltersExtraction-7.0cannot find -lvtkFiltersFlowPaths-7.0...................................................

这个问题的原因可能有两个,

  1. 和问题类型1一样, vtk的lib路径写错了, 按照问题类型1的解决方法来做;
  2. 本机没有安装vtk, 在编译pcl(原生c++)的时候也没有开启vtk选项(否则pcl不会编译成功).

在情况2下, 可以像原生pcl一样, 不编译基于vtk的visualization模块, 这时其他的模块还是能够正常工作的. 具体实现方式也需要对setup.py进行修改:

第一步, 还是找到https://github.com/strawlab/python-pcl/blob/1d83d2d7ce9ce2c22ff5855249459bfc22025000/setup.py#L729 这几行 (这里以pcl 1.8为例, 具体改哪个if分支要按照你本机上的pcl版本决定),

把原来的

elif pcl_version == '-1.8':            # pcl 1.8.0/1?(Ubuntu 18.04)(melodic)            vtk_version = '7.0'            # pcl 1.8.1?            # vtk_version = '8.0'            vtk_include_dir = os.path.join('/usr/include/vtk-' + vtk_version)            vtk_library_dir = os.path.join('/usr/lib')

改成

elif pcl_version == '-1.8':            # pcl 1.8.0/1?(Ubuntu 18.04)(melodic)            vtk_version = 'None' # 只改这一行            # pcl 1.8.1?            # vtk_version = '8.0'            vtk_include_dir = os.path.join('/usr/include/vtk-' + vtk_version)            vtk_library_dir = os.path.join('/usr/lib')

第二步, 再找到这几行https://github.com/strawlab/python-pcl/blob/1d83d2d7ce9ce2c22ff5855249459bfc22025000/setup.py#L853 (同样的, 这里以pcl 1.8为例, 具体改哪个if分支要按照你本机上的pcl版本决定),

将原来的

elif pcl_version == '-1.8':        module = [Extension("pcl._pcl", ["pcl/_pcl_180.pyx", "pcl/minipcl.cpp", "pcl/ProjectInliers.cpp"], language="c++", **ext_args),                  Extension("pcl.pcl_visualization", ["pcl/pcl_visualization.pyx"], language="c++", **ext_args),                  # Extension("pcl.pcl_grabber", ["pcl/pcl_grabber.pyx", "pcl/grabber_callback.cpp"], language="c++", **ext_args),                  # debug                  # gdb_debug=True,                  ]

改成

elif pcl_version == '-1.8':        module = [Extension("pcl._pcl", ["pcl/_pcl_180.pyx", "pcl/minipcl.cpp", "pcl/ProjectInliers.cpp"], language="c++", **ext_args),                  # 把第二个Extension注释掉                                    # Extension("pcl.pcl_visualization", ["pcl/pcl_visualization.pyx"], language="c++", **ext_args),                  # Extension("pcl.pcl_grabber", ["pcl/pcl_grabber.pyx", "pcl/grabber_callback.cpp"], language="c++", **ext_args),                  # debug                  # gdb_debug=True,                  ]

第三步, 再找到这几行https://github.com/strawlab/python-pcl/blob/1d83d2d7ce9ce2c22ff5855249459bfc22025000/setup.py#L666 ,

从原来的模块列表里

else:    # version 1.8    pcl_libs = ["2d", "common", "features", "filters", "geometry",                "io", "kdtree", "keypoints", "ml", "octree", "outofcore", "people",                "recognition", "registration", "sample_consensus", "search",                "segmentation", "stereo", "surface", "tracking", "visualization"]

删除visualization

else:    # version 1.8    pcl_libs = ["2d", "common", "features", "filters", "geometry",                "io", "kdtree", "keypoints", "ml", "octree", "outofcore", "people",                "recognition", "registration", "sample_consensus", "search",                "segmentation", "stereo", "surface", "tracking"] # 删除最后的visualization

这样在编译的时候就会忽略掉visualization模块, 但是其他的算法还是会正常编译并工作.

问题类型3 不编译VTK(裁剪掉python-pcl visualization模块)

强烈建议在编译python-pcl的时候, 裁剪掉和vtk相关的visualization模块:

原因一, 是python有很多3D可视化的库可以用, 都比基于vtk的这个可视化方便好用功能全;

原因二, 就是如问题1,2所描述的, vtk会引入很多不必要的编译错误.

具体的方法大家应该已经猜到了, 就是按照问题类型2情况2的解决办法来做就可以.

问题类型4 编译过程中出现 fatal error: pcl/point_cloud.h: No such file or directory

问题类型5 编译成功之后 import pcl出现undefined symbol: XXXXXXXXXX

问题4和5放在一起说, 是因为它们虽然表现完全不同, 但是都由同一个根源引起的问题.

这个问题的成因就是, 在安装原生pcl的时候省略了某些模块(比如pcl_people, pcl_visualization, pcl_outofcore等模块), 这种编译和安装方式在原生pcl中是允许的, 这样可以对庞大的pcl进行定制化的裁剪, 有利于将其迁移到各个平台.

但是, python-pcl没有考虑这一点, 它在编译过程中, 查找pcl对应的动态链接库/头文件时, 默认所有模块都安装了, 所以在调用pkg-config来生成链接选项时, 一次性传进了所有的模块名称, 而pkg-config有个特性就是, 对于你当前传进的库名称列表, 如果有任何一个库找不到, 就直接报warning, 并且返回空值(而不是返回存在的那些库的路径). 结果就是, 当缺少了任何一个setup.py里写死的pcl模块时, setup.py就会完全找不到pcl的任何库的路径.

因此, 当setup.py无法通过pkg-config找到pcl的头文件目录时, 就会报问题4的错误; 找不到pcl的库文件目录时, 编译过程都正常, 但是最后在import的时候就会报问题5的错误.

解决办法就是, 根据自己本机实际的pcl安装情况来修改setup.py中指定的pcl模块.

第一步, 用下面的命令确定自己装了哪些pcl的模块

ls /usr/local/lib/*.so | grep pcl | cut -d '_' -f 2 | cut -d . -f 1

注意这里最前边的/usr/local/lib, 是我本机安装pcl的路径, 具体是什么内容要按照你自己的环境来配置;

他会输出本机安装的pcl模块名称, 如下所示:

ls /usr/local/lib/*.so | grep pcl | cut -d '_' -f 2 | cut -d . -f 12dcommonfeaturesfiltersioiokdtreekeypointsmloctreerecognitionregistrationsamplesearchsegmentationstereosurfacetracking

我们再来看setup.py里写死了哪些模块 (代码是这几行https://github.com/strawlab/python-pcl/blob/1d83d2d7ce9ce2c22ff5855249459bfc22025000/setup.py#L666 , ):

else:    # version 1.8    pcl_libs = ["2d", "common", "features", "filters", "geometry",                "io", "kdtree", "keypoints", "ml", "octree", "outofcore", "people",                "recognition", "registration", "sample_consensus", "search",                "segmentation", "stereo", "surface", "tracking", "visualization"]

比较本机的模块和setup.py中的配置, 可以发现本机缺少了people, outofcore以及visualization这几个模块.

因此下边要做的就比较直观了, 修改setup.py的对应这几行, 确保列表里只有本机已经安装的模块:

else:    # version 1.8    # 修改下边这个列表, 确保其内容和本机已安装模块一致    pcl_libs = ["2d", "common", "features", "filters", "geometry",                "io", "kdtree", "keypoints", "ml", "octree",                "recognition", "registration", "sample_consensus", "search",                "segmentation", "stereo", "surface", "tracking"]

然后再重新编译就可以了. 注意问题4 5有时候和问题2的情况2是耦合的, 即缺少visualization也可能导致问题4或者5的报错.

上述5类问题是编译python-pcl过程中常见的问题, 如果大家遇到更多的错误请在评论回复, 本文会持续更新.

转载地址:http://pgrzs.baihongyu.com/

你可能感兴趣的文章
appium(10)-iOS predictate
查看>>
程序的优化(PHP)
查看>>
Function.prototype.toString 的使用技巧
查看>>
Zookeeper+websocket实现对分布式服务器的实时监控(附源码下载)
查看>>
Oracle to_char 转换数值
查看>>
selinux-网络服务安全
查看>>
urllib
查看>>
NIOS II 中用结构体指示灯终于正常了
查看>>
CF1009F Dominant Indices - 题解
查看>>
memached实现tomcat的session共享
查看>>
django导出excel
查看>>
【搜索】数的划分
查看>>
智能提示
查看>>
[JavaScript] 弹出编辑框
查看>>
一个消息队列MQ调试工具
查看>>
springmvc 访问时找不到配置文件
查看>>
采访吴岳师兄有感 by 王宇飞
查看>>
LVS简略介绍
查看>>
hdu 1021 Fibonacci Again
查看>>
JVM架构_XmnXmsXmxXss有什么区别:转
查看>>