我想初始化一个全球地图CPP文件将被忽略
std::map<long, std::string> Global_ID_Mapper;
拥有一批像“初始化”类:
struct AGlobalMapperInitializer
{
AGlobalMapperInitializer()
{
Global_ID_Mapper.insert(std::make_pair(1, "Value1"));
Global_ID_Mapper.insert(std::make_pair(2, "Value2"));
}
};
我想,以填补在应用程序启动时自动映射所以在我的一个cpp文件中,我只是定义了一个“init”类的全局变量。
// AGlobalMapperInitializer.cpp
AGlobalMapperInitializer AGlobalMapperInitializer_Value;
映射器填充是AGlobalMapperInitializer_Value
创建的副作用。
问题是,如果cpp不包含除此全局变量之外的任何内容,则cpp明显被链接器忽略。当我将一些有用的其他代码放入cpp中(或者在一些非空cpp中定义全局初始化器时),调用构造函数并填充全局映射器。但是,如果cpp只包含没有在其他文件中引用的全局变量,则会编译cpp,obj文件包含该变量,但链接程序在链接期间未提及它,并且在exe中未被提及。
我该如何坚持将cpp链接到exe? 是否有一些编译指示或虚拟代码放入cpp中以使其不被忽略? 我使用Visual Studio 2012
一个常见的选择是首次使用初始化全局/单例。 – MooseBoys
您可能(Dll)导出整个类AGlobalMapperInitializer并使全局成为该类的静态成员,或者将标题中的全局声明为extern(Dll)在类外部导出。 (否则,全局是一个本地化的翻译单元,并进行了优化) –
链接器会抛弃所有未引用的对象。除了声明不应该导出的导出外,您可以在任何函数中引用它。请注意编译器无法优化此引用,例如'main(){printf(“”,&AGlobalMapperInitializer_Value)); }' – harper