我想初始化一個全球地圖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