在项目中仅调用一次宏

时间:2017-08-18 08:02:40

标签: c++ linker g++ easylogging++

我正在尝试在项目中设置easylogging++,并遇到以下问题:

INITIALIZE_EASYLOGGINGPP应该只在项目中调用一次。现在,如果我从main.cpp调用此宏并且只在easylogging++.h中包含main.cpp - 一切正常。但是,当我尝试将easylogging++.h包含在更多.cpp个文件中时,我会遇到未定义引用的链接器问题(就好像没有调用宏一样)。 如果我将对此宏的调用放在main.cpp之前按字母顺序排列的文件中,则链接器会正常解析所有内容。在链接阶段,对象按字母顺序排序。

有没有一种很好的方法可以解决这个问题?或者我是否必须尝试在链接时强制使用不同的文件顺序?

我对这类问题没有那么多经验,试过谷歌搜索,无法找到解决方案。如果已经存在类似的问题,抱歉,无法找到它。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

也许您可以将调用包装在使用docs调用的函数中,例如:

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

这样你可以多次调用setup_logging(),但宏会被调用一次。

答案 1 :(得分:0)

#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif

#ifndef将检查是否已定义令牌,在这种情况下,此部分将被忽略。

答案 2 :(得分:0)

一些程序员家伙是对的,链接+宏没有问题。

在尝试重新创建最小示例以在此处发布之后,我意识到CMakeLists.txt中存在一个错误导致main.cpp(在其中扩展了easylogging ++宏)在某些情况下被排除在构建之外

感谢大家的时间,并为这个愚蠢的问题感到抱歉。