解决方法:关于ROS在使用第三方库链接和使用时报错的问题

-首先,看一下一般地CMakeLists.txt的写法

一、标准:ROS功能包中调用第三方静态库

include_directories(
   include
   ${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME}_node src/source.cpp
         include/source.h
         )
         
 target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
   ${PROJECT_SOURCE_DIR}/lib/第三方库名
 )

)

-以上一般情况下都没问题,但是有些静态库没有添加pie系统保护功能,导致程序转载的地址是无效的,所以我们在链接时候也需要关闭pie功能。

*注:引入PIE的原因是让程序能装载在随机的地址,通常情况下,内核都在固定的地址运行,如果能改用位置无关,那攻击者就很难借助系统中的可执行码实施攻击了。类似缓冲区溢出之类的攻击将无法实施。而且这种安全提升的代价很小

二、解决链接未开启pie功能的静态库时,编译报错

先作对比:

include_directories(
   include
   ${catkin_INCLUDE_DIRS}
)

add_executable(${PROJECT_NAME}_node src/source.cpp
         include/source.h
         )
         
 target_link_libraries(${PROJECT_NAME}_node
   ${catkin_LIBRARIES}
   ${PROJECT_SOURCE_DIR}/lib/第三方库名 -no-pie
 )

)

与一般的链接形式对比,我们只是在链接第三方库的后面加了-no-pie,之后再到ROS的工作空间中重新编译就完成了!

你可能感兴趣的:(ROS,解决方案,Linux,ROS,ROS相关报错解决)