我正在尝试在项目中设置easylogging++,我遇到了以下问题:
宏INITIALIZE_EASYLOGGINGPP在项目中只能调用一次。现在,如果我从我的main.cpp调用这个宏,并且只在main.cpp中包含easylogging++.h -一切正常。但是,当我试图在更多的.cpp文件中包含easylogging++.h时,我遇到了未定义引用的链接器问题(就像宏还没有被调用一样)。如果我把对这个宏的调用放在一个按字母顺序排在main.cpp之前的文件中,链接器就会正常地解决所有问题。在链接阶段,对象按字母顺序排序。
有没有解决这个问题的好方法?或者我必须尝试在链接时强制不同的文件顺序?
我对这类问题没有太多的经验,我试着在谷歌上搜索,但找不到解决方案。如果已经有类似的问题,对不起,找不到。
谢谢你的帮助!
发布于 2017-08-18 16:50:06
一些程序员是对的,linking+macroes没有问题。
在尝试重新创建最小示例并将其发布到此处后,我意识到在某些情况下,CMakeLists.txt中存在一个错误,导致main.cpp (我在其中展开了easylogging++宏)被排除在构建之外。
感谢大家的宝贵时间,并为这个愚蠢的问题道歉。
发布于 2017-08-18 16:06:27
也许您可以将调用包装在使用std::call_once()调用的函数中,例如:
void setup_logging() {
static std::once_flag once;
std::call_once(once, [] () { INITIALIZE_EASYLOGGINGPP(); });
}这样,您可以多次调用setup_logging(),但宏只被调用一次。
发布于 2017-08-18 16:17:58
#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif#ifndef将检查是否已经定义了令牌,在这种情况下,这一部分将被忽略。
https://stackoverflow.com/questions/45751534
复制相似问题