记录在Clion2022.2版本中使用Makefile工程
前言
首先是有这么一个应用场景,在Windows使用Clion,在虚拟机中的ubuntu系统装有交叉编译器,编译出来的文件要上传到Linux开发板上运行。
其实快速的解决方法也很简单,在Windows上使用Clion和交叉编译器,或者,直接在Linux上使用Clion和交叉编译器,都可以解决好多问题。
但是今天就是要在这么奇怪的组合上使用,我也叹服我自己要这么折腾,一是不想舍弃Clion的代码提示,二是不改变原有的编译环境。
缺点是,总体上来说,Clion到目前为止,支持Makefile工程还是一般般,代码提示比较给力,调试等其他功能,使用远程调试时并且使用Makefile几乎等同于不可用。
打开Makefile工程
Clion识别Makefile工程也很简单,直接使用Clion打开项目中最顶层的Makefile文件,选择作为项目打开,即可将项目识别为Makefile工程。
首次打开,会询问清理文件的target名称,一般习惯上clean作为清理文件target,填入即可。
具体的操作请查看Clion官方的介绍
编译前后的一些配置
一、编译前清理文件
这里使用了远程shell命令实现,也算是绕了一大圈子再工作。
1.增加远程SSH外部工具
在 文件>设置>工具>远程SSH外部工具,点击“+”号增加一个配置,
- 名称填写命名规则合法的的名称即可
- 工具设置 :
- 程序:需要执行的程序
- 实参:执行程序时的参数
- 工作目录:连接上后切换到这个目录再执行程序
例如:在图中转换成命令就是:
cd \home\vmuser\prj1
make clean
需要注意的是,工作目录别忘了设置,不然在错误的位置执行命令,可能会导致无法预知的事情发生。
2.配置到编译项目的配置中
在Clion界面左上角找到这个配置图标,下拉,点击编辑。
进入到如下界面,在执行前,点击“+”号,添加运行远程外部工具,勾选刚才的增加远程SSH外部工具。
二、编译后的文件复制到nfs目录
默认中,编译后执行文件的的路径设定在使用Clion的机器中,如果需要运行交叉编译器的ubuntu系统执行运行命令,须先切换机器到远程ubuntu。
1.切换到远程系统
在 文件>设置>构建、执行、部署>运行目标 中,点击“+”号增加一个配置,连接到目的远程机器。
增加机器后,在下方,项目默认目标更改为刚刚新增的目标机器,右下角点击应用再点击确定。
2.更改调试选项中的配置
在Clion界面左上角找到这个配置图标,下拉,点击编辑。
进入到这个界面:
直接写入执行的文件名 cpfile.sh,其中cpfile.sh的内容如下,/nfsroot是nfs server的目录,app是make生成的目标文件。
cp app /nfsroot/
每次运行项目,编译后,会执行cpfile.sh这个文件,虽然绕了不少弯路,但也算是完成了这个功能。
按照目前这种繁琐的操作,应该还有很大的改进空间,期待能有大佬挖掘出来。
最终解决方案
后面我使用VS Code,插件实在是太香了。
如图中,编辑launch.json和task.json文件编辑一下就能正常使用。配合remote ssh插件,直接编辑虚拟机的文件。
task.json文件内容:
{
"tasks": [
{
"type": "cppbuild",
"label": "make生成活动文件",
"command": "/usr/bin/make",
"args": [
"EXE"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
},
{
"type": "process",
"label": "make清理文件",
"command": "/usr/bin/make",
"args": [
"clean"
],
"options": {
"cwd": "${fileDirname}"
},
"detail": "调试器清理文件的任务。"
}
],
"version": "2.0.0"
}
launch.json文件内容:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"preLaunchTask": "make清理文件",
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app_run",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
以上文件说明,在执行 (gdb) 启动 任务时,由于一下语句存在:
"preLaunchTask": "make清理文件"
会先执行一遍tasks.json文件中label名为make清理文件的任务。其中make清理文件的内容如下:
{
"type": "process",
"label": "make清理文件",
"command": "/usr/bin/make",
"args": [
"clean"
],
"options": {
"cwd": "${fileDirname}"
},
"detail": "调试器清理文件的任务。"
}
翻译过来就是
cd ${fileDirname}
/usr/bin/make clean
两条命令。
可见,方便很多。VS Code还是香。暂时先用VS Code,后续再发掘Clion。