问题:
在vscode中,使用cmake进行configure时,发现catkin_init_workspace
生成的CMakeLists.txt报错:
find_package(catkin) failed. catkin was neither found in the workspace···
分析:
- 经过排查分析,发现是
CMakeLists.txt
中的如下代码出现问题:
# 命令‘catkin_init_workspace’ 生成的‘CMakeLists.txt’
set(catkin_search_path "")
foreach(path ${CMAKE_PREFIX_PATH})
if(EXISTS "${path}/.catkin")
list(FIND catkin_search_path ${path} _index)
if(_index EQUAL -1)
list(APPEND catkin_search_path ${path})
endif()
endif()
endforeach()
- 具体来说是没有从变量
${CMAKE_PREFIX_PATH}
中的路径搜索到.catkin
。
通过直接修改CMakeLists.txt
指向的/opt/ros/melodic/share/catkin/cmake/toplevel.cmake
打印变量${CMAKE_PREFIX_PATH}
,发现输出是空的。 - 但是在系统的终端中进行configure可以通过的,执行的命令与vscde中进行configure时的一致,如下:
# 在vscode中利用cmake-tool进行configure时实际实际执行的命令
/usr/bin/cmake \
--no-warn-unused-cli \
-DCMAKE_PREFIX_PATH=/opt/ros/melodic \
-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -DCMAKE_BUILD_TYPE:STRING=Release \
-DCMAKE_C_COMPILER:FILEPATH=/usr/bin/x86_64-linux-gnu-gcc-7 \
-DCMAKE_CXX_COMPILER:FILEPATH=/usr/bin/x86_64-linux-gnu-g++-7 \
-S/home/will/allpros/avp_slam_sim \
-B/home/will/allpros/avp_slam_sim/build_vsc \
-G "Unix Makefiles"
- 另外,即使在
~/.bashrc
中加入export CMAKE_PREFIX_PATH=/opt/ros/melodic:$CMAKE_PREFIX_PATH
,重启电脑后进行configure依然报错,其中的路径/opt/ros/melodic
是安装ros时确定的,当然也可以使用命令find / -iname *.catkin
或locate *.catkin
查找具体路径。
总结:
- 具体原因暂不明确,疑似是vscode在进行cmake-configure时获取的环境变量
${CMAKE_PREFIX_PATH}
是空的,但是使用系统终端时${CMAKE_PREFIX_PATH}
是有值/opt/ros/melodic
,该值来自有开机时候的source /opt/ros/melodic/setup.bash
,这一步我们在安装ROS的时候已经写入开机时候的自动执行文件~/.bashrc
中,且开机后在系统终端中执行echo $CMAKE_PREFIX_PATH
可以正常输出/opt/ros/melodic
。
解决:
1. 直接修改系统文件
$ sudo gedit /opt/ros/melodic/share/catkin/cmake/toplevel.cmake
在文件/opt/ros/melodic/share/catkin/cmake/toplevel.cmake
中加入
list(APPEND CMAKE_PREFIX_PATH "/opt/ros/melodic")
结果如下:
# toplevel CMakeLists.txt for a catkin workspace
# catkin/cmake/toplevel.cmake
cmake_minimum_required(VERSION 3.0.2)
project(Project)
set(CATKIN_TOPLEVEL TRUE)
list(APPEND CMAKE_PREFIX_PATH "/opt/ros/melodic")
# search for catkin within the workspace
set(_cmd "catkin_find_pkg" "catkin" "${CMAKE_SOURCE_DIR}")
execute_process(COMMAND ${_cmd}
RESULT_VARIABLE _res
OUTPUT_VARIABLE _out
ERROR_VARIABLE _err
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_STRIP_TRAILING_WHITESPACE
)
...
...
...
2. 在vscode的cmake设置中添加属性
Ctrl+Shift+P
--> Preferences: Open Settings (JSON)
添加:
"cmake.configureArgs": [
"-DCMAKE_PREFIX_PATH=/opt/ros/melodic"
],
尾巴:
个人遇见问题,仅做记录和参看,欢迎讨论分析。