项目

问题描述:

我试图建立easylogging++在一个项目中,我遇到了以下问题调用宏只有一次:项目

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

有没有一种很好的方法来解决这个问题?或者我将不得不在链接时强制执行不同顺序的文件?

我对这类问题没有多少经验,尝试过使用Google搜索,找不到解决方案。如果已经有类似的问题,抱歉,找不到它。

感谢您的帮助!

+0

预处理器宏和链接器错误很少连接。请尝试创建一个[最小,完整和可验证示例](http://*.com/help/mcve)并向我们展示,并向我们展示您获得的实际错误(以文本形式复制粘贴,完整,完整且没有任何修改)。 –

+0

关于术语的说明,预处理器宏不是“调用”,而是*扩展*。简而言之,在C++解析器读取源代码之前,宏的调用在源代码中由宏的扩展主体*替换*。 –

+0

嗨,感谢您的评论,这不是一个小项目,所以我会尽量花一些时间来创建一个最简单的例子,并在这里复制输出。 – paperplane

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

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

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

也许你可以包装在调用使用std::call_once()一个函数调用,例如:

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

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

#ifndef INITIALIZE_EASYLOGGINGPP 
#define INITIALIZE_EASYLOGGINGPP SomeLogic 
#endif 

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