未正确处理路径中的提升 space

Boost space in path not being handled correctly

我正在使用 Boost 进程 header,由于目录中的 space,我似乎无法让 boost::process::system 接受我的 .cpp 文件路径.

auto path = bp::search_path("g++");
int result = bp::system(path, "\"C:\Users\Sachin Chopra\Documents\rchat\console_process\src\main.cpp\"");

我在执行代码时遇到以下错误:

g++.exe: error: "C:\Users\Sachin: Invalid argument
g++.exe: error: Chopra\Documents\rchat\console_process\src\main.cpp": No such file or directory
g++.exe: fatal error: no input files

文件路径格式适用于我的 .exe 文件,如果我使用它,将从 boost 启动。例如

bp::system("\"C:\Users\Sachin Chopra\Documents\rchat\build\console_process\consoleproc.exe\"");

但是我引入g++路径的时候,好像乱七八糟的。任何帮助将不胜感激。

干杯。

您将 shell 脚本与 system 界面混淆了。

您可以使用旧样式,error-prone system:

bp::system(R"(bash -c "echo hello; echo world")");

或者您可以传递原始参数而不是依赖 shell 转义

bp::system(bp::search_path("bash"),
           std::vector<std::string>{
               "-c",
               "echo foo; echo bar",
           });

也可以这样写

bp::system(bp::search_path("bash"), "-c", "echo 42; echo answer");

事实上,您应该使用 bp::child 界面而不是 system 兼容的一个:

bp::child compiler_job(
    bp::search_path("g++"),
    R"(C:\Users\Sachin Chopra\Documents\rchat\console_process\src\main.cpp)");

compiler_job.wait_for(5s);
if (compiler_job.running()) {
    compiler_job.terminate();
}

int result = compiler_job.exit_code();
std::cout << "compiler_job exit_code: " << result << "\n";

现场演示

Live On Coliru

#include <boost/process.hpp>
#include <iostream>
namespace bp = boost::process;
using namespace std::chrono_literals;

int main() {
    // either use old style, error-prone system
    bp::system(R"(bash -c "echo hello; echo world")");

    // or pass raw arguments instead of relyng on shell escaping
    bp::system(bp::search_path("bash"),
               std::vector<std::string>{
                   "-c",
                   "echo foo; echo bar",
               });

    // Which can aslo be written as
    bp::system(bp::search_path("bash"), "-c", "echo 42; echo answer");

    // in fact, you should probably use the `bp::child` interace instead of the
    // `system` compatible one:
    bp::child compiler_job(
        bp::search_path("g++"),
        R"(C:\Users\Sachin Chopra\Documents\rchat\console_process\src\main.cpp)");

    compiler_job.wait_for(5s);
    if (compiler_job.running()) {
        compiler_job.terminate();
    }

    int result = compiler_job.exit_code();
    std::cout << "compiler_job exit_code: " << result << "\n";
}

打印例如

hello
world
foo
bar
42
answer
g++: error: C:\Users\Sachin Chopra\Documents\rchat\console_process\src\main.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
compiler_job exit_code: 1