• 记录YDLidar驱动包交叉编译时出现的一点问题


    由于一不小心把交叉编译的系统根目录破坏了,所以一股脑将交叉编译系统根目录全删了重新安装,安装后,交叉编译发现ydlidar的ros包驱动出现了库无法链接的错误(刚刚还是好好的),但是又想不起来之前是怎么解决的了,所以还是一步一步重新解决这个问题吧(以后碰见啥问题怎么解决还是记录一下吧,因为过一段时间真会忘!!!)

    编译错误来自ydlidar_ros_driver-master这个ros包,错误如下:

    [ 93%] Linking CXX executable /home/lwh/code/rk3399_ws/devel/lib/ydlidar_ros_driver/ydlidar_ros_driver_node
    /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/ld: 当搜索用于 //usr/local/lib/libydlidar_sdk.a 时跳过不兼容的 -lydlidar_sdk
    /usr/lib/gcc-cross/aarch64-linux-gnu/7/../../../../aarch64-linux-gnu/bin/ld: 找不到 -lydlidar_sdk
    collect2: error: ld returned 1 exit status
    ydlidar_ros_driver-master/CMakeFiles/ydlidar_ros_driver_node.dir/build.make:115: recipe for target '/home/lwh/code/rk3399_ws/devel/lib/ydlidar_ros_driver/ydlidar_ros_driver_node' failed
    make[2]: *** [/home/lwh/code/rk3399_ws/devel/lib/ydlidar_ros_driver/ydlidar_ros_driver_node] Error 1
    CMakeFiles/Makefile2:2210: recipe for target 'ydlidar_ros_driver-master/CMakeFiles/ydlidar_ros_driver_node.dir/all' failed
    make[1]: *** [ydlidar_ros_driver-master/CMakeFiles/ydlidar_ros_driver_node.dir/all] Error 2
    make[1]: *** 正在等待未完成的任务....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以看到链接器ld在在对目标文件链接时无法找到匹配的库-lydlidar_sdk,
    ydlidar_sdk库是通过find_package()查找的,CMakeLists.txt内容如下:

    find_package(ydlidar_sdk REQUIRED)
    ...
    add_executable(${PROJECT_NAME}_node src/ydlidar_ros_driver.cpp)
    
    #---------------------------------------------------------------------------------------
    #link library directories
    target_link_directories(${PROJECT_NAME}_node PRIVATE
        ${YDLIDAR_SDK_LIBRARY_DIRS}
    )
    target_link_libraries(${PROJECT_NAME}_node
    	${catkin_LIBRARIES}
    	${YDLIDAR_SDK_LIBRARIES}
    	-pthread
    	)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    其中,target_link_directories()作用是设置链接器链接目标target时查找库的路径,通过message()打印YDLIDAR_SDK_LIBRARY_DIRS,发现这个变量为空,那么这样的话只要将YDLIDAR_SDK_LIBRARY_DIRS设置为正确的库路径,那么应该就能解决这个问题。

    接着打开find_package()所查找并执行的cmake配置文件ydlidar_sdkConfig.cmake,可以看到如下内容:

    SET( YDLIDAR_SDK_LIBRARIES  "ydlidar_sdk;pthread;rt" CACHE INTERNAL "YDLIDAR_SDK libraries" FORCE )
    SET( YDLIDAR_SDK_INCLUDE_DIRS /usr/local/include/src;/usr/local/include CACHE INTERNAL "YDLIDAR_SDK include directories" FORCE )
    SET( YDLIDAR_SDK_LIBRARY_DIRS  CACHE INTERNAL "YDLIDAR_SDK library directories" FORCE )
    
    mark_as_advanced( YDLIDAR_SDK_LIBRARIES )
    mark_as_advanced( YDLIDAR_SDK_LIBRARY_DIRS )
    mark_as_advanced( YDLIDAR_SDK_INCLUDE_DIRS )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以看到,缓存变量YDLIDAR_SDK_LIBRARIES设置为了"ydlidar_sdk;pthread;rt",这意味着target_link_libraries()将会根据这个变量链接
    名称为ydlidar_sdk,pthread和rt的库,注意这个名称不是库文件名,而是库的标识名,是在add_library()中设置的,对于静态库,标识名为ydlidar_sdk的库实际的库文件名为libydlidar_sdk.a, 对于共享库为libydlidar_sdk.so。
    而YDLIDAR_SDK_INCLUDE_DIRS的路径是原X86系统的路径,这显然是不正确的,应该要改为交叉编译的系统根目录路径。
    另外,YDLIDAR_SDK_LIBRARY_DIRS,库的链接路径这里直接设置为了空,这里也要修改。

    最后修改后的内容如下:

    SET( YDLIDAR_SDK_LIBRARIES  "ydlidar_sdk;pthread;rt" CACHE INTERNAL "YDLIDAR_SDK libraries" FORCE )
    SET( YDLIDAR_SDK_INCLUDE_DIRS  /交叉编译系统根目录/usr/local/include/src;/交叉编译系统根目录/usr/local/include CACHE INTERNAL "YDLIDAR_SDK include directories" FORCE )
    SET( YDLIDAR_SDK_LIBRARY_DIRS  /交叉编译系统根目录/usr/local/lib CACHE INTERNAL "YDLIDAR_SDK library directories" FORCE )
    
    mark_as_advanced( YDLIDAR_SDK_LIBRARIES )
    mark_as_advanced( YDLIDAR_SDK_LIBRARY_DIRS )
    mark_as_advanced( YDLIDAR_SDK_INCLUDE_DIRS )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    修改后保存,再执行交叉编译,编译通过。

  • 相关阅读:
    利用jar包构建Docker 镜像
    Java模拟抽奖。奖池有以下几个奖项:【2,1888,588,388,2888】打印出抽奖结果,要求随机且不重复。两种方法(代码和优化后的代码)
    vue - Vue路由(扩展)
    CSS---div盒子模型、相对绝对位置、float浮动、清除浮动
    linux下keepalived的安装和配置
    FPGA-出租车计价器的实现
    浅谈机器视觉目前的发展现状
    【leetcode】重排链表
    简单了解Vue及其指令
    流媒体分析之rtmp ffmpeg 实现-两种技术实现
  • 原文地址:https://blog.csdn.net/qq_42700518/article/details/132911359