概要
最近需要调试一个小的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
如果在意这个警告,可以在
CMakeLists.txt
文件中添加
project(ProjectName)
例如:
Reload CMakeLists.txt
文件后,可以看到警告会消失。
第三步调整编译
如果直接用我们做好的这个 |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
下可以发现二进制文件都生成了。
调试
工具栏可以发现有调试选项,可以进行调试。
还可以根据需要编辑调试选项。