【发布时间】:2025-12-08 04:50:02
【问题描述】:
我正在尝试使用 Unity Builds 来缩短 Windows 上 c++ 项目的构建时间。我遇到的几个问题之一是单一文件范围问题。
一旦所有源代码都包含在一个源文件中,它们就会共享相同的文件范围。所有使用相同名称的本地定义符号将重复并导致编译错误。
目前,我必须使用文件后缀更改每个重复的名称以避免重复。但我认为可能会有更好的解决方案。
【问题讨论】:
我正在尝试使用 Unity Builds 来缩短 Windows 上 c++ 项目的构建时间。我遇到的几个问题之一是单一文件范围问题。
一旦所有源代码都包含在一个源文件中,它们就会共享相同的文件范围。所有使用相同名称的本地定义符号将重复并导致编译错误。
目前,我必须使用文件后缀更改每个重复的名称以避免重复。但我认为可能会有更好的解决方案。
【问题讨论】:
我想分享我目前的解决方案。
在生成unity_build_source_<index>.cpp 文件时,定义一个UNITY_BUILD 宏并用宏包装每个包含源代码:
// unity_build_souce file, automatically generated, do not edit manually.
#define UNITYBUILD_CONCATENATE_DETAIL(x, y) x##y
#define UNITYBUILD_CONCATENATE(x, y) UNITYBUILD_CONCATENATE_DETAIL(x, y)
#define UNITYBUILD_MAKE_UNIQUE(x) UNITYBUILD_CONCATENATE(x, _UNITYBUILD_COUNTER)
#define UNITY_BUILD
// for each source code
#define _UNITY_BUILD_COUNTER 1
#include <path/to/source1.cpp>
#undef _UNITY_BUILD_COUNTER
#define _UNITY_BUILD_COUNTER 2
#include <path/to/source2.cpp>
#undef _UNITY_BUILD_COUNTER
// ...
在源代码中,对重复的名称使用 UNITYBUILD_MAKE_UNIQUE 宏。
#ifdef UNITY_BUILD
#define a_duplicated_variable UNITYBUILD_MAKE_UNIQUE(a_duplicated_variable)
#define ADuplicatedClass UNITYBUILD_MAKE_UNIQUE(ADuplicatedClass)
#define aDuplicatedFunction UNITYBUILD_MAKE_UNIQUE(aDuplicatedFunction)
#endif
namespace
{
int a_duplicated_variable = 3;
class ADuplicatedClass
{
public:
ADuplicatedClass(int ){}
};
}
void aDuplicatedFunction()
{
ADuplicatedClass c(a_duplicated_variable);
}
#ifdef UNITY_BUILD
#undef a_duplicated_variable
#undef ADuplicatedClass
#undef aDuplicatedFunction
#endif
我知道这个解决方案看起来仍然很糟糕。与手动更改每个重复的符号相比,它保留了旧名称的外观。
【讨论】: