问题描述:
在学习Ros系统的过程中,使用c++语言编写项目之后需要对项目进行编译才能运行。有时候会出现这种情况:使用source指令导入环境变量,但执行rosrun指令运行就报错
zg@zg-virtual-machine:~/Project/Receive_lidar$ source ./devel/setup.bash
zg@zg-virtual-machine:~/Project/Receive_lidar$ rosrun lidar_test lidarTest_node
[rosrun] Couldn't find executable named lidarTest_node below /home/zg/Project/Receive_lidar/src/lidar_test
原因分析:
这是由于项目编译之后,可执行文件不在devel/lib/your_project_name路径下,我们可以来到devel目录下,使用查找功能查找对应的可执行文件名,我的项目编译完后,可执行文件落在了build路径下(大多数都是这种情况吧)
解决方案:
查阅过相关问题的解决办法,有的说是包下面的CMakeLists.txt文件需要加上catkin_package()就可以,有的说需要将catkin_package()放在add_executable之前,我试过了都没效果
最终的解决办法是,设定生成路径,在CMakeLists.txt文件里添加以下指令即可,位置任意:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/lib/${PROJECT_NAME})
最终我的CMakeLists.txt内容如下,可供参考:
cmake_minimum_required(VERSION 3.0.2)
project(lidar_test)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
find_package(PCL 1.9.1 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
# target_link_libraries(lidarTest_node ${PCL_LIBRARIES})
# 指定可执行文件生成在devel目录下
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/lib/${PROJECT_NAME})
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES lidar_test
# CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)
add_executable(lidarTest_node src/lidarTest_node.cpp)
# 如果依赖多个库,需按照以下格式,将多个库并列排开,如${catkin_LIBRARIES} ${PCL_LIBRARIES}
# 若分成多句target_link_libraries,如:target_link_libraries(lidarTest_node ${catkin_LIBRARIES})
# target_link_libraries(lidarTest_node ${PCL_LIBRARIES})会报错
target_link_libraries(lidarTest_node ${catkin_LIBRARIES} ${PCL_LIBRARIES})
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
执行编译,在对应目录下可查看到对应的可执行文件,完结撒花。
zg@zg-virtual-machine:~/Project/Receive_lidar$ rosrun lidar_test lidarTest_node
因为没有连接雷达,没有订阅到相关话题,所以看不到数据输出