我正在尝试在项目中设置easylogging++
,并遇到以下问题:
宏INITIALIZE_EASYLOGGINGPP
应该只在项目中调用一次。现在,如果我从main.cpp
调用此宏并且只在easylogging++.h
中包含main.cpp
- 一切正常。但是,当我尝试将easylogging++.h
包含在更多.cpp
个文件中时,我会遇到未定义引用的链接器问题(就好像没有调用宏一样)。
如果我将对此宏的调用放在main.cpp
之前按字母顺序排列的文件中,则链接器会正常解析所有内容。在链接阶段,对象按字母顺序排序。
有没有一种很好的方法可以解决这个问题?或者我是否必须尝试在链接时强制使用不同的文件顺序?
我对这类问题没有那么多经验,试过谷歌搜索,无法找到解决方案。如果已经存在类似的问题,抱歉,无法找到它。
感谢您的帮助!
答案 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 ++宏)在某些情况下被排除在构建之外
感谢大家的时间,并为这个愚蠢的问题感到抱歉。