Я пытаюсь найти замену вызову "system" (из stdlib.h) в моей программе на C++. До сих пор я использовал его для вызова g++ в моей программе для компиляции и последующего связывания переменного количества исходных файлов в каталоге, выбранном пользователем.
Вот пример того, как примерно может выглядеть команда: "C:/mingw32/bin/g++.exe -L"C:\mingw32\lib" [...]"
Однако у меня возникла проблема (по крайней мере, с компилятором MinGW, который я использую) я получаю сообщение об ошибке "Командная строка слишком длинная", когда командная строка становится слишком длинной. длинный. В моем случае это было около 12000 символов. Поэтому мне, вероятно, нужен другой способ вызова g++. Кроме того, я читал, что обычно не следует использовать слово «система»: http://www.cplusplus.com/forum/articles/11153/
Поэтому мне нужна какая-то замена (которая также должна быть максимально независимой от платформы, потому что я хочу, чтобы программа работала в Windows и Linux). Я нашел одного кандидата, который в целом выглядит вполне подходящим:
_execv / execv:
Независимость от платформы, но:
а) http://linux.die.net/man/3/exec говорит: " Семейство функций exec() заменяет текущий образ процесса новым образом процесса". Итак, мне нужно сначала вызвать "fork", чтобы программа C++ не была завершена? Доступен ли форк для Windows/MSVC?
б) Используя «систему», я проверил, равно ли возвращаемое значение 0, чтобы увидеть, можно ли скомпилировать исходный файл. Как это будет работать с exec? Если я правильно понимаю man-страницу, будет ли она возвращать только успех создания нового процесса, а не статус g++? И с помощью какой функции я могу приостановить свою программу, чтобы дождаться завершения g++ и получить возвращаемое значение?
В общем, я не совсем уверен, как мне с этим справиться. Каковы ваши предложения? Как межплатформенные программы, такие как Java (Runtime.getRuntime().exec(command)) или Eclipse C++ IDE, решают эту проблему? Что бы вы посоветовали мне сделать, чтобы вызвать g++ независимым от системы способом - с таким количеством аргументов, как я хочу?
РЕДАКТИРОВАТЬ: Теперь я использую следующий код - я еще тестировал его только в Windows, но, по крайней мере, там он работает так, как ожидалось. Спасибо за идею, jxh! Возможно, в будущем я рассмотрю возможность сокращения команд с помощью относительных путей. Тогда мне пришлось бы найти независимый от платформы способ изменения рабочего каталога нового процесса.
#ifdef WIN32
int success = spawnv(P_WAIT, sCompiler.c_str(), argv);
#else
pid_t pid;
switch (pid = fork()) {
case -1:
cerr << "Error using fork()" << endl;
return -1;
break;
case 0:
execv(sCompiler.c_str(), argv);
break;
default:
int status;
if (wait(&status) != pid) {
cerr << "Error using wait()" << endl;
return -1;
}
int success = WEXITSTATUS(status);
}
#endif