from cv_bridge.boost.cv_bridge_boost import getCvType error解决

用python3 + ROS的小伙伴可能会遇到这个问题
cv_bridge也build成功了,import也找到了,怎么一用就不行了

File "/opt/ros/melodic/lib/python2.7/dist-packages/cv_bridge/core.py", line 91, in encoding_to_cvtype2
    from cv_bridge.boost.cv_bridge_boost import getCvType
cv_bridge_boost.so: undefined symbol: _ZN5boost6python6detail11init_moduleEPKcPFv

报的错很神奇,undefined symbol, 后来往上一看才知道是getCvType的问题,

直接上解决方案吧:
环境是ubuntu16 + python3.7 + ROS kinetic
还没build过cv_bridge的小伙伴按下面的操作,已经build过的查缺补漏

$ sudo apt install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge
$ mkdir -p cv_bridge_ws/src && cd cv_bridge_ws
$ git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
$ apt-cache show ros-kinetic-cv-bridge | grep Version
$ cd src/vision_opencv/
# 切换到需要的版本
$ git checkout 1.12.8
$ cd ../../
# 注意找到python3.7m的路径,我的是装在/usr/local/python3.7下面的
$ catkin config -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/local/python3.7/include/python3.7m -DPYTHON_LIBRARY=/usr/local/python3.7/lib/libpython3.7m.so
$ catkin build
$ source devel/setup.bash --extend
$ cd ../catkin_ws
# 到工作空间下make
$ catkin_make
$ source devel/setup.bash

按照上面步骤走就成功了,总结一下,
我这里出的问题在于应该先在cv_bridge_ws下source devel/setup.bash --extend,然后再去工作空间catkin_make,
之前是source devel/setup.bash --extend后就直接用了
还有就是切换到合适的版本

参考链接

<think>嗯,我现在遇到了一个CMake构建错误,具体是cv_bridge_boost在make的时候报错,错误代码2。这让我有点困惑,需要一步步分析可能的原因和解决方法。 首先,我应该回忆一下用户提供的引用内容。引用[3]提到需要修改module.hpp文件,把最后一段的代码改成static void do_numpy_import() { import_array(); }。这可能和Python的numpy库有关,可能是因为没有正确初始化数组导致的错误。所以第一步应该检查这个修改是否已经完成,或者是否正确应用了。 然后,引用[4]里提到了设置Boost的包含目录和库目录。如果CMake找不到Boost库,可能会导致链接错误。用户提供的错误可能和Boost有关,所以需要确认CMakeLists.txt中是否正确设置了Boost的路径,比如使用set(Boost_INCLUDE_DIR /usr/local/include)和set(Boost_LIBRARY_DIR /usr/local/lib)。此外,还要检查系统中是否安装了正确版本的Boost库,以及是否安装了dev包,比如libboost-dev或者libboost-python-dev。 接下来,引用[1]中的安装步骤是否正确执行?用户是否按照顺序执行了mkdir build、cmake ..、make、sudo make install?有时候,构建目录没有清理干净会导致奇怪的问题,可能需要删除build目录重新执行cmake,或者尝试make clean后再编译。 另外,关于OpenCV的版本兼容性。用户提到测试时用了opencv-3.4.16,而cv_bridge可能依赖特定版本的OpenCV。如果系统中安装了多个版本的OpenCV,或者cv_bridge编译时链接了错误的版本,可能导致符号未找到或者兼容性问题。需要检查CMake的输出,确认找到的OpenCV版本是否正确,是否与cv_bridge兼容。可能需要设置OpenCV_DIR环境变量指向正确的安装路径,或者在CMake命令中指定-DOpenCV_DIR=/path/to/opencv。 还有,Python的环境问题。cv_bridge可能依赖Python2和Python3的兼容性。如果系统中默认的Python版本与cv_bridge期望的不一致,可能导致模块导入错误。需要确认编译时使用的Python版本是否正确,可能需要通过CMake参数指定PYTHON_EXECUTABLE,例如-DPYTHON_EXECUTABLE=/usr/bin/python3。 此外,依赖项是否安装完整?比如,是否安装了python3-dev、numpy等开发包?这些依赖项的缺失可能导致编译时头文件找不到或者链接错误。 还有一个可能是权限问题。在安装过程中使用sudo make install时,是否有足够的权限写入目标目录?或者之前安装的部分文件权限不正确,导致后续编译失败? 最后,查看具体的错误日志。错误代码2通常表示编译过程中的错误,比如语法错误、链接错误等。需要查看CMakeFiles目录下的日志文件,或者make命令的输出,找到具体的错误信息。例如,是否提示某个函数未定义,或者某个头文件找不到,或者库链接失败? 总结可能的原因: 1. module.hpp未正确修改导致Python相关错误。 2. Boost库路径未正确设置,或Boost版本不兼容。 3. OpenCV版本不匹配或路径未正确配置。 4. Python环境或依赖项缺失。 5. 未正确执行安装步骤或权限问题。 6. 其他依赖项如numpy未正确安装。 接下来,按照步骤逐一排查这些问题。</think>### 解决CMake构建cv_bridge_boost时的`make error 2`问题 #### 1. 检查`module.hpp`的修改 根据引用[^3],需修改`cv_bridge`的`module.hpp`文件,确保最后36-40行代码调整为: ```cpp static void do_numpy_import() { import_array(); } ``` 若未修改或修改不完整,会导致Python与C++数组交互失败,从而引发编译错误。修改后需重新运行CMake和make命令[^3]。 --- #### 2. 配置Boost库路径 在`CMakeLists.txt`中添加以下路径声明(引用[^4]): ```cmake set(Boost_INCLUDE_DIR /usr/local/include) set(Boost_LIBRARY_DIR /usr/local/lib) ``` 同时确认系统已安装Boost开发包: ```bash sudo apt-get install libboost-dev libboost-python-dev ``` 若使用Python3,需安装`libboost-python3-dev`。 --- #### 3. 检查OpenCV版本兼容性 确保安装的OpenCV版本与`cv_bridge`兼容(如OpenCV 3.4.16)。通过CMake输出确认检测到的OpenCV路径: ```bash cmake .. -DOpenCV_DIR=/path/to/opencv ``` 若存在多版本冲突,需卸载冲突版本或通过环境变量指定路径。 --- #### 4. 验证Python环境 指定CMake使用正确的Python解释器(例如Python3): ```bash cmake .. -DPYTHON_EXECUTABLE=/usr/bin/python3 ``` 安装Python开发依赖: ```bash sudo apt-get install python3-dev python3-numpy ``` --- #### 5. 清理并重新构建 删除旧的构建目录并重新编译: ```bash cd cv_bridge rm -rf build mkdir build && cd build cmake .. make sudo make install ``` --- #### 6. 查看详细错误日志 若问题仍未解决,需通过`make`输出的具体错误信息进一步分析。例如: - **头文件缺失**:检查依赖包是否安装完整。 - **符号未定义**:确认库链接顺序或版本匹配性。 - **权限问题**:使用`sudo`执行安装命令。 --- ### 相关问题 1. 如何确认CMake找到的OpenCV版本是否正确? 2. 如何解决Boost库链接时的“未定义引用”错误? 3. 在ROS中如何强制指定Python3作为cv_bridge的依赖? 4. CMake编译时如何生成更详细的调试信息?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值