1

我想在每次构建后创建反汇编文件。此命令将执行此操作:

arm-none-eabi-objcopy -DS project.elf > project.dasm

如何用qbs执行它?试图为它制定一个规则。

Rule {
    id: dasm
    inputs: "application"
    Artifact {
        fileTags: ["dasm"]
        filePath: FileInfo.baseName(input.filePath) + ".dasm"
    }
    prepare: {
        var args = ["-DS", input.filePath, ">", output.filePath];
        var cmd = new Command("arm-none-eabi-objdump", args);
        cmd.description = "disassembler from: "+FileInfo.fileName(input.filePath);
        cmd.highlight = "linker";
        cmd.silent = true;
        return cmd;

    }
}

但这只是在构建控制台中显示结果,并在最后两个参数上显示错误。有任何想法吗?

4

2 回答 2

0

我认为您不能在 qbs 中使用输出管道。这些 ( >, >>, |) 不起作用,因为Command它不是 bash shell。Command作为参数传递>给 arm-none-eabi-objcopy。你可能想创建一个这样的 shell 脚本:

我的ShellScript.sh

#!/bin/bash
arm-none-eabi-objcopy -DS $1 > $2

然后在你的规则中调用 shell 脚本。

Rule {
    id: dasm
    inputs: "application"
    Artifact {
        fileTags: ["dasm"]
        filePath: FileInfo.baseName(input.filePath) + ".dasm"
    }
    prepare: {
        var args = [input.filePath, output.filePath];
        var cmd = new Command("myShellScript.sh", args);
        cmd.description = "disassembler from: "+FileInfo.fileName(input.filePath);
        cmd.highlight = "linker";
        cmd.silent = true;
        return cmd;
        }
    }
}
于 2016-05-13T19:41:13.877 回答
0

在 Qbs 1.5.0 中,您可以使用Command 对象上stdoutFilePath的新属性和属性将命令输出重定向到文件。stderrFilePath

例如:

Rule {
    id: dasm
    inputs: ["application"]
    Artifact {
        fileTags: ["dasm"]
        filePath: input.baseName + ".dasm"
    }
    prepare: {
        var args = ["-DS", input.filePath];
        var cmd = new Command("arm-none-eabi-objdump", args);
        cmd.description = "disassembling " + input.fileName;
        cmd.stdoutFilePath = output.filePath;
        cmd.highlight = "linker";
        cmd.silent = true;
        return cmd;
    }
}
于 2016-05-14T04:19:30.597 回答