这是一个示例 C++ 程序,它使用名为 MY_MACRO 的宏,您将在调用 MSBuild 之前使用 /D option 在 CL environment variable 中设置该宏:
#include <iostream>
#include <string>
#ifndef MY_MACRO
#define MY_MACRO "unknown"
#endif
std::string greeting(const std::string& their_name)
{
static constexpr char my_name[] = MY_MACRO;
return "Hello, " + their_name + ", nice to meet you!\nMy name is " + my_name + '.';
}
int main()
{
std::cout << "Please enter your name: ";
std::string their_name;
std::cin >> their_name;
std::cout << greeting(their_name) << '\n';
}
如上述文档中所述,在处理环境变量时,您将使用数字符号 (#) 而不是等号 (=) 来定义具有显式值的预处理器常量。此外,通过命令行定义字符串常量时,需要对双引号 (") 进行转义(如 \")。
总而言之,这里是一个示例 PowerShell 脚本,用于构建和收集十个不同的可执行文件,每个可执行文件将使用不同的字符串文字作为 MY_MACRO 的值,从名称列表中选择,在循环中(请注意,在脚本中,\" 需要在双引号前使用反引号表示为 \`",以便 PowerShell 将逐字解释双引号字符串中的双引号):
$MSBuildExe = 'C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe'
$MSBuildCmdLineArgs = @('MySolution.sln', '/property:Configuration=Release;Platform=x64', '/target:Rebuild', '/maxCpuCount')
New-Item -Force -ItemType Directory -Name 'CollectedExecutables'
$Names = @('Anni', 'Frida', 'Kadi', 'Mari', 'Piia', 'Pille', 'Piret', 'Reet', 'Siret', 'Triinu')
foreach ($MyNameString in $Names)
{
$env:CL = "/DMY_MACRO#\`"$MyNameString\`""
& $MSBuildExe $MSBuildCmdLineArgs "/property:TargetName=executable_named_$MyNameString"
Copy-Item -LiteralPath "x64\Release\executable_named_${MyNameString}.exe" -Destination 'CollectedExecutables'
}
在此脚本中,我假设您使用的是 Visual Studio 2022;否则只需将$MSBuildExe 的值更改为适当的路径。另外,我假设你想为你的 C++ 项目构建一个 Release(不是 Debug)配置,并且你想为 x64 构建一个em>平台。如果没有,请相应地更改脚本中的这些字符串。当然,将 C++ 解决方案文件的实际名称(而不是 MySolution.sln)放入脚本中 MSBuild 命令行参数数组的第一个元素中。