MSBuild不在控制台窗口应用程序中使用“system”进行编译

时间:2017-11-02 00:43:48

标签: c++ msbuild

我正在尝试使用控制台应用程序中的system关键字编译项目来调用MSBuild。 MSBuild吐出一个项目未找到错误,我不知道为什么。路径和项目名称都是正确的并打印出来。 https://gyazo.com/624847f060e242ad702f16174ac75701

我的代码:

bool MSBuild::compile(std::string path, std::string solution) {
if (path.length() == 0 || solution.length() == 0)
    return false;

std::string cmd1 = "cd ";
cmd1.append(path);

std::cout << "Command: " << cmd1 << std::endl;

std::string cmd2 = "msbuild ";
cmd2.append(solution);
cmd2.append(" /p:configuration=debug");

std::cout << "Command: " << cmd2 << std::endl;

system(cmd1.c_str());
system(cmd2.c_str());
return true;
}

我已确认MSBuild在手动将具有相同参数的相同命令输入到cmd窗口时成功编译项目。 https://gyazo.com/a7f4c3f07f3f44b418734f4a979ca398

1 个答案:

答案 0 :(得分:0)

system()的每次调用都会产生一个命令提示符,其中包含自己的环境和工作(当前)目录。

第二个电话是&#34;不知道&#34;第一次调用的操作,因此它将尝试在默认情况下使用的任何工作目录中运行您提供的命令。

您可以在致电system("cd");后致电system(cmd1.c_str());来证明这一点 - 这很可能不是您期望的价值!

可能的解决方法是尝试将两个命令连接在一起,以及命令提示符用于链接命令的内容,&&&,具体取决于您的偏好。

代码的示例改编版本:

bool MSBuild::compile(std::string path, std::string solution) {
if (path.length() == 0 || solution.length() == 0)
    return false;

std::string cmd1 = "cd ";
cmd1.append(path);

std::cout << "Command: " << cmd1 << std::endl;

std::string cmd2 = "msbuild ";
cmd2.append(solution);
cmd2.append(" /p:configuration=debug");

std::cout << "Command: " << cmd2 << std::endl;

std::string cmd = cmd1 + std::string(" & ") + cmd2;
std::cout << "Combined Command: " << cmd << std::endl;

//system(cmd1.c_str());
//system(cmd2.c_str());
system(cmd.c_str());
return true;
}

您将在此问答语中找到一些相关的补充参考,包括&&&之间的差异:What does “&&” in this batch file?

另一种方法是将命令写入单个批处理文件,并使用system()来调用它。