未正确处理路径中的提升 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";
现场演示
#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
我正在使用 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";
现场演示
#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