項目

2017-08-18 54 views
0

我試圖建立easylogging++在一個項目中,我遇到了以下問題調用宏只有一次:項目

INITIALIZE_EASYLOGGINGPP應僅在該項目調用一次。現在,如果我從我的main.cpp調用此宏,並且只包含中的easylogging++.h - 一切正常。但是,當我嘗試在更多的.cpp文件中包含easylogging++.h時,我遇到未定義引用的鏈接器問題(就好像該宏未被調用一樣)。 如果我將此宏的調用放在main.cpp之前的字母文件中,則鏈接器將正常解析所有內容。在鏈接階段,對象按字母順序排序。

有沒有一種很好的方法來解決這個問題?或者我將不得不在鏈接時強制執行不同順序的文件?

我對這類問題沒有多少經驗,嘗試過使用Google搜索,找不到解決方案。如果已經有類似的問題,抱歉,找不到它。

感謝您的幫助!

+0

預處理器宏和鏈接器錯誤很少連接。請嘗試創建一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示,並向我們展示您獲得的實際錯誤(以文本形式複製粘貼,完整,完整且沒有任何修改)。 –

+0

關於術語的說明,預處理器宏不是「調用」,而是*擴展*。簡而言之,在C++解析器讀取源代碼之前,宏的調用在源代碼中由宏的擴展主體*替換*。 –

+0

嗨,感謝您的評論,這不是一個小項目,所以我會盡量花一些時間來創建一個最簡單的例子,並在這裏複製輸出。 – paperplane

回答

0

一些程序員老兄是對的,鏈接+宏觀沒有問題。

在嘗試重新創建最小示例以將其發佈到此處後,我意識到CMakeLists.txt中存在一個錯誤,它導致main.cpp(其中我擴展了easylogging ++宏)從某些內部排除情況。

謝謝大家的時間,併爲這個愚蠢的問題感到抱歉。

1

也許你可以包裝在調用使用std::call_once()一個函數調用,例如:

void setup_logging() { 
    static std::once_flag once; 
    std::call_once(once, []() { INITIALIZE_EASYLOGGINGPP(); }); 
} 

這樣,你可以撥打setup_logging()多次,但宏被調用一次。

0
#ifndef INITIALIZE_EASYLOGGINGPP 
#define INITIALIZE_EASYLOGGINGPP SomeLogic 
#endif 

#ifndef將檢查令牌是否已被定義,在這種情況下,這部分將被忽略。