江门关键词排名优化,网站关键词优化,搜索引擎seo推广,快速网站推广由于一不小心把交叉编译的系统根目录破坏了#xff0c;所以一股脑将交叉编译系统根目录全删了重新安装#xff0c;安装后#xff0c;交叉编译发现ydlidar的ros包驱动出现了库无法链接的错误(刚刚还是好好的)#xff0c;但是又想不起来之前是怎么解决的了#xff0c;所以还…由于一不小心把交叉编译的系统根目录破坏了所以一股脑将交叉编译系统根目录全删了重新安装安装后交叉编译发现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]: *** 正在等待未完成的任务....可以看到链接器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)其中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 )可以看到缓存变量YDLIDAR_SDK_LIBRARIES设置为了ydlidar_sdk;pthread;rt这意味着target_link_libraries()将会根据这个变量链接 名称为ydlidar_sdkpthread和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 )修改后保存再执行交叉编译编译通过。