Я использую заголовок процесса Boost и не могу заставить 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++, он, кажется, портится. Любая помощь будет оценена по достоинству.
Ваше здоровье.
Привет, спасибо за помощь! Я попробовал это, и я все еще получаю ту же ошибку, к сожалению.
Вы путаете сценарий оболочки с интерфейсом system
.
Вы можете использовать старый стиль, подверженный ошибкам system
:
bp::system(R"(bash -c "echo hello; echo world")");
Или вы можете передавать необработанные аргументы вместо того, чтобы полагаться на экранирование оболочки.
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
Глядя на документы g++ (cs.bu.edu/fac/gkollios/cs113/Usingg++.html), вы не можете просто передать файл, сначала вам нужен какой-то параметр. Попробуйте bp::system(путь, "-c",...)