• Visual Studio Code 中编译和调试 CMake 项目(Milvus Knowhere为例)


    背景:需要通过调试 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.

    1. cd workspace/knowhere
    2. 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

  • 相关阅读:
    简单好用的文档管理系统MinDoc
    LeetCode经典面试150题-day5(多数元素)
    计算机体系结构:不同改进方案的性价比计算
    detect_topic
    LabVIEW异步调用VI
    安卓开机启动流程
    2022 ACM-ICPC 网络赛(1) A题
    【回眸】Linux内核(五)复刻cp命令
    茶楼计时茶室时钟计费系统,佳易王共享茶室收银计时收费管理系统软件下载
    【C++ Miscellany】继承体系非尾端类设计为抽象类
  • 原文地址:https://blog.csdn.net/davidullua/article/details/126619039