Компиляция C из C ++ Windows - PullRequest
0 голосов
/ 03 мая 2020

Я ищу простой или простой способ программной компиляции c программы из приложения C ++ на windows.

Мой creator.exe исполняемый файл, написанный на C ++, должен принимать NAME константу от пользователя и компилировать result.c с этой константой, окончательно возвращающей пользователю скомпилированный result.exe файл.

Пример:

// result.c
#ifndef NAME
    #define NAME"undefined"
#endif

int main() {
  printf("Welcome %s\n", NAME);
  return 0;
}

На linux это просто, как я могу просто вызвать:

system("gcc result.c -DNAME Bob -o result");

Я новичок в windows и, возможно, есть более чистый способ выполнить такую ​​компиляцию, тогда используя системную команду.

Обновление

Я очень рад видеть так много полезных ответов :) Я прочитал их все и решил использовать system функция. Теперь я не хочу устанавливать все переменные среды самостоятельно, так как это настоятельно не рекомендуется Microsoft. Я хотел бы использовать Developer Command Prompt for VS2019, поскольку все эти переменные уже установлены правильно. С Developer Command Prompt Я хотел бы выполнить msbuild для компиляции исходного кода result.c.

Теперь проблема в том, что я не уверен, возможно ли вызвать msbuild в Developer Command Prompt из C ++?

Что я имею в виду под этим:

#define DEV_CMD "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\Tools\\VsDevCmd.bat"

sprintf_s(cmd, "cmd \/S \/C \"\"%s\"\" && msbuild \/p:DefineConstants=\"DEBUG;NAME=\"%s\"\" ..\\result\\result.vcxproj", DEV_CMD, "Bob");

/* cmd /S /C ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat"" && msbuild /p:DefineConstants="DEBUG;NAME="Bob"" ..\result\result.vcxproj */
system(cmd);

Вышеприведенное, конечно, не работает, так как && откроет Developer Command Prompt в одном процессе и затем запустит msbuild в другом процессе.

1 Ответ

1 голос
/ 03 мая 2020

На Windows вы можете использовать cl.exe вместо gcc. Чтобы определить что-то, вам нужно установить cl переменную окружения.

Так что следующее должно помочь:

system("set CL=%CL% /DNAME#\"Bob\"");
system("cl result.c /out:result.exe");

Прочтите MSDN, чтобы узнать больше:

https://docs.microsoft.com/en-us/cpp/build/walkthrough-compile-a-c-program-on-the-command-line?view=vs-2019

https://docs.microsoft.com/en-us/cpp/build/reference/cl-environment-variables?view=vs-2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...