Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Cmake输出相对路径?;_Cmake_Windows Subsystem For Linux - Fatal编程技术网

如何使Cmake输出相对路径?;

如何使Cmake输出相对路径?;,cmake,windows-subsystem-for-linux,Cmake,Windows Subsystem For Linux,在我上次删除的关于CMake的问题中,我提出了一个关于如何使CMake输出相对路径的问题,因为vscode的问题面板仅限于此 了解工作区下的Windows目录或相对路径 除非有特殊情况,否则这种情况不会发生。如果您在Windows中使用vsocde编辑源文件,并使用WSL作为终端使用CMake进行编译,您将发现vscode无法完美工作 问题面板将告诉您在编译完成后找不到错误或警告的源代码 gdb在调试时找不到源文件 (1) 第一个问题的解决方案:将以下代码添加到最外层的CMakeLists.tx

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

除非有特殊情况,否则这种情况不会发生。如果您在Windows中使用vsocde编辑源文件,并使用WSL作为终端使用CMake进行编译,您将发现vscode无法完美工作

  • 问题面板将告诉您在编译完成后找不到错误或警告的源代码
  • gdb在调试时找不到源文件
  • (1) 第一个问题的解决方案:将以下代码添加到最外层的CMakeLists.txt:

    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_SOURCE_DIR}/custom_output.sh")
    
    全局规则_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
                                }
            ]
    
    "postLaunchCommands": ["set substitute-path /mnt/d d:/"]
    
    如果使用Cortex debug进行调试,则应在launch.json中添加以下代码

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

    使用日志文件将不可重入。只需在阅读时使用“$@”…。但是只要
    “$@”| sed's^/mnt/d/demo@@@
    “$@”2>>(sed's^/mnt/d/demo@@@')
    Och,再想一想,
    2>(sed's^/mnt/d/demo@@@')
    将把stderr重定向到stdout。所以像
    {“$@”2>>(sed's^/mnt/d/demo@@@3);}3>&2
    这样的东西会更好-它也会在stderr上输出stderr消息。请允许我向您表示最诚挚的感谢。