0

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

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

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

我对这类问题没有太多经验,尝试谷歌搜索,找不到解决方案。如果已经有类似的问题,抱歉,找不到。

谢谢您的帮助!

4

3 回答 3

1

也许您可以将调用包装在您调用 using 的函数中std::call_once(),例如:

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

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

于 2017-08-18T08:06:27.210 回答
0

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

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

感谢大家的宝贵时间,并对愚蠢的问题感到抱歉。

于 2017-08-18T08:50:06.367 回答
0
#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif

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

于 2017-08-18T08:17:57.723 回答