使用Clion调试C程序

概要

最近需要调试一个小的C程序,使用Clion导入工程的时候发现无法进行调试。这里就需要我们创建CMake文件达到调试目的。

背景

目前Clion仅支持CMake项目,对于AutoMake和普通的Makefile项目并不是天生支持的。
如果需要调试的话,需要为工程增加CMake的支持,也就是编写一个CMakeLists.txt文件。

准备

首先需要确保程序的根目录下有Makefile文件,且编译通过。如果是用Automake组织的工程,需要手动先生成Makefile文件。
还需要保证已经安装了了 CMake

$cmake --version
cmake version 3.15.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

制作CMakeLists.txt文件

第一步

Github上有一个Python脚本可以帮助我们从一个Makefile生成CMakeLists.txt文件,可以参考这里。

第二步

使用Clion导入我们上一步生成的CMakeLists.txt文件。会显示warning

image.png

如果在意这个警告,可以在CMakeLists.txt文件中添加

project(ProjectName)

例如:


image.png

Reload CMakeLists.txt文件后,可以看到警告会消失。

image.png

第三步调整编译

如果直接用我们做好的这个 |Build -> Build Project 可能会发现编译错误,比如:

Undefined symbols for architecture x86_64:
  "_BZ2_bzRead", referenced from:
      _bz2_read in bspatch.c.o
  "_BZ2_bzReadClose", referenced from:
      _main in bspatch.c.o
  "_BZ2_bzReadOpen", referenced from:
      _main in bspatch.c.o
ld: symbol(s) not found for architecture x86_64
ld: symbol(s) not found for architecture x86_64
clangclang: : errorerror: : linker command failed with exit code 1 (use -v to see invocation)linker command failed with exit code 1 (use -v to see invocation)

make[2]: make[2]: *** [bsdiff] Error 1*** [bspatch] Error 1

make[1]: *** [CMakeFiles/bsdiff.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make[1]: *** [CMakeFiles/bspatch.dir/all] Error 2
make: *** [all] Error 2

因为每个人遇到的错误可能不同,这里就需要我们针对错误的情况进行分析和相应的修改。我们使用脚本生成的CMakeLists.txt文件很可能不含有工程依赖的外部库。这里就需要我们找到并添加到文件中去。

详细的信息可以从这里了解

对于我们的例子,打开CMakeLists.txt文件,添加如下的代码

find_package (BZip2) #查找Package
if (BZIP2_FOUND)
    include_directories(${BZIP_INCLUDE_DIRS}) #引入头文件
    target_link_libraries (bspatch ${BZIP2_LIBRARIES}) #链接 bspatch 这个target
    target_link_libraries (bsdiff ${BZIP2_LIBRARIES}) #链接 bsdiff 这个target
endif (BZIP2_FOUND) 

在这里例子里需要编译出 bsdiff 和 bspatch 2个target,所以有两行 target_link_libraries。
调整后,可以编译通过了,在根目录下的cmake-build-debug下可以发现二进制文件都生成了。

调试

工具栏可以发现有调试选项,可以进行调试。

image.png

还可以根据需要编辑调试选项。

你可能感兴趣的:(使用Clion调试C程序)