首页 > 解决方案 > 如何让Cmake输出相对路径?

问题描述

在我上次删除的关于 CMake 的问题中,我提出了一个关于如何使 CMake 输出相对路径的问题,因为 vscode 的问题面板仅了解 Windows 目录或工作区下的相对路径。

除非某些特定情况,否则不会发生这种情况。如果你在 Windows 中使用 vsocde 编辑源文件,并使用 WSL 作为终端使用 CMake 编译,你会发现 vscode 无法完美运行。

  1. 问题面板会告诉你编译完成后找不到错误或警告的源代码。
  2. gdb 调试时找不到源文件。

标签: cmakewindows-subsystem-for-linux

解决方案


(1)第一个问题的解决方法:在你最外层的CMakeLists.txt中加入如下代码:

set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_SOURCE_DIR}/custom_output.sh")

全局 RULE_LAUNCH_COMPILE 属性设置为名为 custom_output.sh 的自定义启动脚本,需要将其添加到 CMake 源代码树的根目录:

  #!/bin/bash
    
    # shell script invoked with the following arguments
    # $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE
    
    # extract parameters
    SOURCE_FILE="${@: -1:1}"
    OBJECT_FILE="${@: -3:1}"
    
    # invoke compiler 
    { "$@" 2> >(sed 's@^/mnt/d/demo/@@'|sed "s/warning/${esc}[32m&${esc}[0m/g"|sed "s/error/${esc}[31m&${esc}[0m/g" >&3); } 3>&2    
    

它还会在 stderr 上输出 stderr 消息并将其转换为相对路径。其中“/mnt/d/demo/”是要删除的字符串。删除什么取决于源代码的相对路径。

(2)您可以使用 gdb 中的以下命令进行重新映射以解决第二个问题:

set substitute-path old_path new_path

您需要向您的 launch.json 添加后续代码

 "customLaunchSetupCommands": [
                            {
                                "text": "set substitute-path /mnt/d d:/",
                                "description": "change directory to workspace",
                                "ignoreFailures": false
                            }
        ]

如果您使用 Cortex Debug 进行调试,您应该将以下代码添加到您的 launch.json

"postLaunchCommands": ["set substitute-path /mnt/d d:/"]

推荐阅读