【问题标题】:Compile C from C++ Windows从 C++ Windows 编译 C
【发布时间】:2020-05-03 11:56:59
【问题描述】:

我正在寻找一种干净或简单的方法来以编程方式从 Windows 上的 C++ 应用程序编译 c 程序。

我用 C++ 编写的creator.exe 可执行文件应该从用户那里获取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 函数。现在我不想自己设置所有的环境变量,因为微软强烈反对这样做。我想使用Developer Command Prompt for VS2019,因为它已经正确设置了所有这些变量。从Developer Command Prompt我想执行msbuild编译result.c源代码。

现在的问题是我不确定是否可以从 C++ 调用 Developer Command Prompt 下的 msbuild

我的意思是这样的:

#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

【问题讨论】:

  • 您可以在 Windows 上执行相同的操作。安装 MinGW,将二进制文件添加到您的 PATH 并调用 system("gcc result.c -DNAME Bob -o result");。恕我直言,一种更简洁的方法是某种脚本,例如 Makefile 或 PowerShell 脚本
  • command line tools 可用于 Visual Studio。

标签: c++ c windows visual-studio


【解决方案1】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-11-17
    相关资源
    最近更新 更多