问题描述
这段时间在使用VsCode进行ROS程序开发的时候,经常会出现一个问题,就是代码已经做了修改,但是编译之后得到的可执行文件却始终没有更新代码中做的修改内容。
VSCode开发环境环境:
主要使用CmakeTools插件,通过该插件能够自动进行Cmake配置并且生成自动代码补全等的配置,可以免去手动设置一大堆配置文件。其他插件对于本文问题无影响,包括:C/C++插件,Cmake插件,ROS插件(微软提供)。
问题原因排查
通过阅读插件自动Cmake输出的日志和检查build文件夹下目录结构发现,插件CmakeTools在自动执行cmake配置时将devel目录设置到了build目录下,也就是说,本来应该生成可执行文件到工作空间下的devel文件夹,但通过插件后,它将这个文件夹重新定位到了build/devel,导致后来通过插件编译的结果全都生成到了该文件夹下,因此工作空间devel文件夹下的可执行文件始终为得到更新,进而导致了我遇到的问题。找到原因之后,解决起来就不难了。发现问题的日志内容如下:
生成的build目录结构如下,可以看到devel正处在build文件夹下:
解决方法
通过日志可以看出,devel文件夹的位置是通过一个名为
C
A
T
K
I
N
_
D
E
V
E
L
_
P
R
E
F
I
X
CATKIN\_DEVEL\_PREFIX
CATKIN_DEVEL_PREFIX的cmake变量来设置的,改变量默认为devel文件夹,但是是在build文件夹下的devel,因此我们只需要将这个变量的值指定为工作空间下的devel文件夹即可。
具体操作如下:
-
打开scode的设置settings界面,找到extension下的CMakeTools,这时会进入到该插件的详细设置页面,如下图所示:
-
在这个界面往下翻找到Cmake:Configettings选项,如下图所示,点开Edit in settings.json
-
点击将会打开配置文件,记住该配置文件与工程目录下.vscode/setting.json不是同一个文件,一定要通过这里打开。配置文件如下图,点开后会自动添加并定位到"cmake.configureSettings"设置内容,我们在其中添加变量 C A T K I N _ D E V E L _ P R E F I X CATKIN\_DEVEL\_PREFIX CATKIN_DEVEL_PREFIX的值为工作空间的devel文件夹。
-
到此问题已经得到解决。删除原来的build文件夹,右键工作空间src文件夹下的CMakeLists.txt文件,点击ConfigureAll重新自动配置项目即可。重新配置时在输出日志中可以看到如下内容:
Tips
关于变量的值,理论上可以设置成任意自定义的位置,但是若设置成自定义的位置,想要运行节点之前需要source该目录下的setup.bash脚本。解决该问题之后,就可以使用CmakeTools插件提供的编译按钮对程序进行编译,无论是编译全部还是单独编译某一个节点均可。