如何在 VS Code 中编译和调试 CMake 项目

背景:需要通过调试 C/C++ 项目的代码来分析代码的逻辑。 以 Milvus 的核心库 Knowhere 为例子,演示如何在 Visual Studio Code 中编译/调试 CMake 项目。

环境:MacOS Intel(x86_64)或 Debian/Ubuntu Linux。 目前 Mac Sillicon M1 上还没有成功编译 Milvus/Knowhere 工程。Debian 经过测试可以成功编译。

Milvus 是一个向量检索数据库,用于图像,音频,DNA 生物信息的检索。Knowhere 是 Milvus 中的 C++ 核心库的实现。

在 VS Code 中编译/调试 CMake 项目的 6 个步骤:

1.Visual Studio Code 中安装 CMake Tools 扩展。 

之后在命令行切换到源代码目录,运行 code . 打开 visual studio code.

cd workspace/knowhere
code .

2.打开 VS Code 的 CMake 工具视图配置 CMake Projects

在 visual studio code 中,左侧侧边栏,打开 Cmake 视图,点击 "Configure All Projects", 能看到 CMake 的 Target。

 这个时候即可 Build 默认的 Knowhere 的 工程。 

3.添加 unittest 工程到默认的 cmake build 中

编辑 CMakeLists.txt 文件, 如图

添加 253, 254 行。 注释掉 256-260 行。

4.删除 .vscode 目录下的所有工程文件。 清理 cmake cache 文件

rm -f `find ./ -name CMakeCache.txt`

5.VS Code 侧边栏的 CMake 视图,选择 unittest 的 Build ,右键点击运行 cmake build, cmake debug. 

执行会有报错, 提示说找不到 gtest 库。ld: library not found for -lgtest

如果没有按照 knowhere 的工程执行过 build,先 build整个工程。

然后在 gtest 源码目录 build, install gtest.
cd knowhere/cmake_build/thirdparty/gtest/googletest-src/
mkdir build && cd build
cmake ..
makd && make install
gtest  默认安装在了 /usr/local 目录下。需要添加到 lib 和 include path中,可以在命令行添加环境变量,然后命令行下面启动 code . 打开项目(前提是安装了 visual studio code 的命令行工具到系统中 code 命令才能用)。

在 terminal 控制台设置环境变量:

#添加到gcc头文件
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/include/

#添加到g++头文件路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/include/

#添加到动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

#添加到静态库
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib/

如果需要这些参数对于每个终端都有效,
需要把命令添加到 ~/.bash_profile, 或者 ~/.zshrc 中.

这些变量设置之后, /usr/local/ 目录的库和头文件会自动引用。 这个时候从命令行终端重新启动 code, 环境变量会生效。

注意:如果不是从终端启动 visual studio code ,这些参数是无效的。

6.在 VS Code 的 CMake 视图, 重新 Build unittest 工程

成功 Build, 这个时候也可以 执行 CMake Debug 来调试(参考步骤5的截图), 通过 Debug unittest 中的代码可以启动调试,在代码中可以增加断点,如图:

常见问题

1.出现这个错误:
[build] Does not match the generator used previously: Unix Makefiles

解决方法:
删除原先的 CMakeCache.txt 文件。(faiss目录)
原因在于版本不统一,之前编译过CMakeLists.txt后,产生了缓存文件CMakeCache.txt,
rm -f `find ./ -name CMakeCache.txt`
删除CMakeCache.txt文件,解决。

2.出现错误 ld: library not found for -lgtest

因为 IDE 环境中找不到 gtest 库,mac 系统下面 /usr/local/lib, /usr/local/include 目录没有自动添加到编译路径中。 参考前面的说明添加到环境变量中,Terminal 终端重启 Visual Studio Code 使得参数生效。 如果不是从 Terminal 启动 VS Code,可以将变量加到 /etc/bashrc 或者 /etc/zshrc 中(加到哪个文件取决于使用的哪个 Shell)

3.命令行如何执行指定的 gtest 单元测试

执行指定的单元测试(bash下执行):
./output/unittest/test_knowhere --gtest_filter=IVFParameters/IVFTest.*

zsh 下面这样执行:
./output/unittest/test_knowhere --gtest_filter="IVFParameters/IVFTest.*"
 

参考:在 VS code 中 Build 和 Debug CMake 工程:
https://www.youtube.com/watch?v=Rfj40xW9q6w&ab_channel=DBersan

猜你喜欢

转载自blog.csdn.net/davidullua/article/details/126619039