项目
问题描述:
我试图建立easylogging++
在一个项目中,我遇到了以下问题调用宏只有一次:项目
宏INITIALIZE_EASYLOGGINGPP
应仅在该项目调用一次。现在,如果我从我的main.cpp
调用此宏,并且只包含中的easylogging++.h
- 一切正常。但是,当我尝试在更多的.cpp
文件中包含easylogging++.h
时,我遇到未定义引用的链接器问题(就好像该宏未被调用一样)。 如果我将此宏的调用放在main.cpp
之前的字母文件中,则链接器将正常解析所有内容。在链接阶段,对象按字母顺序排序。
有没有一种很好的方法来解决这个问题?或者我将不得不在链接时强制执行不同顺序的文件?
我对这类问题没有多少经验,尝试过使用Google搜索,找不到解决方案。如果已经有类似的问题,抱歉,找不到它。
感谢您的帮助!
答
一些程序员老兄是对的,链接+宏观没有问题。
在尝试重新创建最小示例以将其发布到此处后,我意识到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
将检查令牌是否已被定义,在这种情况下,这部分将被忽略。
预处理器宏和链接器错误很少连接。请尝试创建一个[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)并向我们展示,并向我们展示您获得的实际错误(以文本形式复制粘贴,完整,完整且没有任何修改)。 –
关于术语的说明,预处理器宏不是“调用”,而是*扩展*。简而言之,在C++解析器读取源代码之前,宏的调用在源代码中由宏的扩展主体*替换*。 –
嗨,感谢您的评论,这不是一个小项目,所以我会尽量花一些时间来创建一个最简单的例子,并在这里复制输出。 – paperplane