目录
Step0 CLion是啥
Step1 安装
Step2 配置
2.1 编译器选择
2.2 编译器配置
2.3 新建项目
2.4 CMakeLists
2.5 *头文件
Step3 使用
3.1 新建源文件
3.2 编译并运行
3.3 修改源文件名
3.4 删除源文件
Step4 断点调试
4.1 变量
4.2 *汇编
4.3 内存
4.4 单步调试
4.5 循环调试技巧
Step5 *What's More?
在同学向我吐槽codeblock多么难用于是我疯狂安利CLion的时候,他发出了灵魂的拷问——“CLion是啥?”
CLion和codeblock一样都是可以编写C/CPP的IDE(集成开发环境),CLion的优点多多,尤其是CLion对小白非常友好。
那么,代价是什么?CLion的缺点同样明显:巨能吃内存,随随便便打开一个项目就能占用内存到1G;性能开销很大,我的配置是137k+96G内存,在重新加载cmake或切换编译器时,都会有非常明显的卡顿。
本文章不涉及任何C/CPP基础知识,以下带“*”记号表示可选项。
此处以Windos10/11为例,下载地址:Download CLion: A Smart Cross-Platform IDE for C and C++ (jetbrains.com)
下载后双击安装,一直点击next即可。
可自行选择其他安装路径。
如果不了解各项含义,可以直接全部勾选。
Update PATH Variable:加入到系统环境变量中,建议勾选。
Create Associations:关联默认应用,勾选后,对应的文件后缀将默认用CLion打开。
成功安装后,无须打开CLion,直接进行破解。
链接放在评论区,链接失效请私信或评论。
(P.S. 正常jetBrain可以通过学生认证来获取一年的免费使用,但由于学校在制裁名单上......)
CLion自带MinGW11.0(GCC/G++13.0.0),也可以另行安装MinGW6.0(GCC/G++8.1.0)或VS17.0(MSVC1937),本文仅以自带的编译器为例。
打开CLion,找到“Customize”,点击“All settings...”。
找到“Build, Execution, Deployment”,点击“Toolchains”。
点击右侧窗口中左上的加号“+”,选择“MinGW”,其余内容自动补充完整。
接着,点击左侧“Toolchains”下方的"CMake",同样点击右侧窗口中左上的加号“+”,出现“debug”,其余内容自动补充完整。
点击右下角“Apply”,完成编译器配置。
找到“Projects”,点击“New Project”。
C在左侧选择“C Executable”,右侧选择创建项目的路径和名称(强烈建议全英文),语言标准推荐C11。
C++在左侧选择“C++ Executable”,右侧选择创建项目的路径和名称(强烈建议全英文),语言标准推荐C++17。
创建项目后会自动进入到项目中,在左侧文件列表打开“CMakeLists.txt”,删掉原本内容,并复制粘贴如下内容:
C:
cmake_minimum_required(VERSION 3.26)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C)
set(CMAKE_C_STANDARD 11)
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.c")
foreach(file ${files})
get_filename_component(name ${file} NAME)
add_executable(${name} ${file})
endforeach()
C++:
cmake_minimum_required(VERSION 3.26)
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} CXX)
set(CMAKE_CXX_STANDARD 17)
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
get_filename_component(name ${file} NAME)
add_executable(${name} ${file})
endforeach()
而后,右键“CMakeLists.txt”,点击“Reload Cmake Project”,就可以愉快地使用啦~
新建一个文件夹:右键文件列表,依次点击“new”,"Directory",输入文件名,尽量只包含英文、数字、下划线。
在新建的文件夹中新建头文件:右键文件夹,依次点击“new”,"C/C++ Header File",输入名称和选择类型。
C选择“.h”,CPP选择“.hpp”;文件名只能包含英文、数字、下划线;注意红框内不打勾。
修改CMakeLists,在set下方添加:
include_directories(include)
重新加载CMakeLists。
在左侧文件列表右键单击,依次点击“new”,“C/C++ Source File”,并输入名称和选择类型。
C选择“.c”,C++选择“.cpp”;文件名只能包含英文和数字;注意红框内均不打勾。
(P.S. 第二个不打勾是因为CMakeLists文件会在重新加载时,已自动将新建的源文件添加到Configurations中;如果再添加到targets,在编译运行其他源文件时,将看到“multiple definition of main”的报错,此时编译器会将两个源文件一起编译,而一个程序只能有一个main函数)
在新建文件中打出主函数,并右键"CMakeLists.txt",点击Reload Cmake Project,重新加载CMakeLists。
在下方蓝色进度条加载完后,点击左下角第一个图标CMake,看到提示[Finished]。
此时,看到右上方Configurations中出现了新建的源文件。
上图中,上方从左到右依次为:选择编译器,选择源文件,构造(用于项目打包整体编译,现阶段用不到),运行,调试。
随便写点东西,点击运行(快捷键Shift+F10),就可以在下方看到运行结果了。
单击要修改名称的源文件,按下快捷键“Shift+F6”,修改名称,并点击"Refactor"。
重新加载CMakeLists,[Finished]后,发现右上源文件名也随之改变。
单击要删除的源文件,按下"delet",或右键单击并点击“delet”。
确认删除。
本节中以我写的Polland-rho算法为例(只是因为写的时候刚好写完这个,才不是因为懒),这是一个用来寻找大合数小素因子的算法,无需关心它是如何实现的。
首先在可能出现问题的地方开始处打断点,左键单击源文件的行号,出现红点,该行被标红。
而后点击“Debug”(快捷键Shift+F9),可以看到程序停在断点处。
在"Threads & Variables"窗口中,按下快捷键“Alt+F8”,弹出计算器窗口,在该窗口中可以计算变量在各种运算下的值(甚至包括取址符!)。
输入表达式并按下回车,上图给出了变量n的地址。
每次运行时地址都会不一样,关于这点请去了解C/CPP。
点击下方窗口中的“GDB”,输入“disas”(disassemble)并回车,即可看到AT&T汇编指令。
也可以改成Intel格式的汇编,输入set disassembly-flavor intel"并回车,在输入"disas"并回车。
GDB能做到的事情还有很多,也包括调试,但本文并不打算讨论这些。
下方窗口点击“Memory View”,就可查看内存情况。
在4.1中我们看到变量n的地址是“0x5ffe30”,n的值是“39617”。此处我们同样输入“&n”并回车。
可以看到,变量n的地址确实是"0x5ffe30",但“39617”转换为16进制为“9a c1”,为什么内存里是反过来的?
关于这一点请去了解C/CPP,这是由于采用了小端序。
回到一开始的"Threads & Variables"窗口,左上角有一些控制按钮,从左到右依次是:Rerun(Ctrl+F5),Stop(Ctrl+F2),Resume(F9),Pause(暂时用不上),Step Over(F8),Step Into(F9),Step Out(Shift+F8)。
Resume:继续运行程序直到遇到下一个断点。
Step Into:一步步执行,遇到子函数时,进入子函数内部,继续一步步执行。
Step Over:遇到子函数时,不会进入到子函数内部,直接执行完子函数;但在子函数内部有断点时,会停在断点处。
Step Out:直接执行完本函数,并跳回外层函数相应位置;但在函数内部有断点时,会停在断点处。
在没有子函数时,Step Into和Step Over作用相当。
调试到上图处时,下一句将进入到子函数“gcd( )”中,此时使用Step Over下一句为“if”条件句,"gcd()"被执行完;而使用Step Into将进入到“gcd( )”中,再使用Step Out又执行完了“gcd()”并跳回到下一句为“if条件句”。
使用Rerun,回到断点;此时使用Resume或Step Out可以发现,循环被执行了一次,程序又停在了断点处。
这就是循环调试的第一个技巧,在循环结构头部或尾部打断点,并使用Resume或Step Out实现执行一次循环;但需要注意的是,Resume的最后一次循环会直接运行完程序,而Step Out的最后一次循环会直接函数返回。
另一个技巧常被用在“for”循环中,右键断点并输入判断条件,相当于插入一个“if”判断句,只有满足条件时,才会在断点处停止。
和C/CPP规范不同,此处判断相等直接使用“a=b”而非“a==b”。
调试也是一门艺术,但本文并不打算深入探讨。
使用任何产品时(尤其是软件和电子设备)请学会使用说明书(RTFM=Read The Fxcking Mamual),并查阅有关教程(STFW=Search The Fxcking Web,对于软件而言可能是官方论坛或其他软件交流社区),在提问时能够正确地提问(这是另外一个深刻的话题了),最后在深入思考前请先动手试试。
因而想要深入了解CLion,最好的办法之一就是查阅官方文档:
CLion Documentationhttps://www.jetbrains.com/help/clion/installation-guide.html
对小白而言确实障碍重重,但也是必经之路;在这之前,或许就是本篇文章存在的意义。