2016-08-01 20 views
0

我使用一個模塊級的函數調用來註冊的註冊類工廠功能:G ++ 4.9 - 模塊範圍內的函數未被調用?

static Controller * ctor(Device * device, const char *) { return new NullController(device); } 
static int s_id = DeviceRegistry::RegisterControllerClass("null", ctor); 

//------------------------------------------------------------------------------ 

NullController::NullController(Device * device) 
: Controller(device, "null", s_id) 
{ 
} 

其中例如:: DEV :: DeviceRegistry :: RegisterControllerClass()是在命名空間如免費功能DEV。這在Visual Studio下運行良好,但是在GCC/Linux上運行代碼似乎沒有被調用 - 如果我斷點RegisterControllerClass(),它不會被調用。爲了防止編譯器優化s_id字段,我使用它來構造基類。所以我相信不是這樣。這段代碼有什麼問題?

+1

您必須確保翻譯單元已鏈接。一種方法是從'main'中調用其中的函數。 –

+2

什麼是模塊範圍? – NathanOliver

+0

在翻譯單元內(即cpp文件+包含的標題)。如果他們沒有被標記爲「靜態」,我會說'全球'。 –

回答

0

連接器試圖過於聰明並刪除它認爲未被調用的代碼,但會間接調用它。

添加命令行選項在NetBeans連接選項對話框庫

輪候冊,各地 - 全歸檔 LIB 輪候冊, - 無整個歸檔 ...

解決了這個問題。育。

+0

W1?你在開玩笑嗎? -Wl。 –

+0

@KonstantinVladimirov哈哈,有趣的字體(記住關於從不使用'l'作爲變量的編碼規則) –

相關問題