【问题标题】:Batch building the same code multiple times with different values for a variable in Visual Studio在 Visual Studio 中使用不同的变量值批量构建相同的代码
【发布时间】:2022-02-03 13:40:27
【问题描述】:

我需要使用变量 MyVar 构建我的代码。我需要构建它,例如。 10 次,但每次,MyVar 都会不同,例如。

第一次构建: static unsigned char MyVar[] = "ABC";

第二次构建: static unsigned char MyVar[] = "XYZ";

是否可以选择以批处理方式执行此操作?例如。命令行?我只是不想手动更改 MyVar,按“构建”,重命名构建文件等。

非常感谢

PS:我不是专业的编码员,这可能是不好的做法。同时我只想完成工作,不想过多更改代码。

PPS:已经研究了一些东西(属性表、自定义宏、每次/后期构建操作、环境变量),但没有找到合适的东西。

【问题讨论】:

  • 您可以使用CL 环境变量来设置特定的预处理器定义,也可以通过命令行设置特定的MSBuild 属性,请参阅stackoverflow.com/q/65927984/1458097
  • 顺便说一下,char MyVar 只能包含 一个 字符(如 'A''B')。你可能指的是char MyVar[]
  • 嗨@heapunderrun,非常感谢,是的,“[]”是对的......
  • 嗨@heapunderrun,非常感谢,是的,“[]”是对的......我正在尝试阅读CL,但没有取得多大成功。你能举一个例子在我的具体情况下如何工作吗?我会在代码中输入什么而不是 static unsigned char MyVar[] = "ABC";?对于构建属性也一样:如何更改代码,是否需要在项目文件中创建属性,然后在命令行中使用 msbuild 的 -p 开关覆盖?非常感谢!

标签: visual-studio visual-c++


【解决方案1】:

这是一个示例 C++ 程序,它使用名为 MY_MACRO 的宏,您将在调用 MSBuild 之前使用 /D optionCL 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 命令行参数数组的第一个元素中。

【讨论】:

  • 非常感谢您的详细解释,真的很有帮助。已经实现了 :-) 可能会提出更多问题。
猜你喜欢
  • 1970-01-01
  • 2019-06-23
  • 2019-12-13
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多