Я пытаюсь настроить easylogging++
в проекте, и я столкнулся со следующей проблемой:
макрос INITIALIZE_EASYLOGGINGPP
следует вызывать только один раз в проекте. Теперь, если я вызову этот макрос из моего main.cpp
и включать только easylogging++.h
в main.cpp
— все работает отлично. Тем не менее, когда я пытаюсь включить easylogging++.h
в большем .cpp
файлы, я получаю проблемы компоновщика с неопределенными ссылками (как будто макрос не был вызван).
Если я помещу вызов этого макроса в файл в алфавитном порядке перед main.cpp
, линкер разрешает все нормально. На этапе связывания объекты сортируются в алфавитном порядке.
Есть хороший способ решить эту проблему? Или мне придется пытаться форсировать другой порядок файлов во время компоновки?
Я не очень опытен в подобных проблемах, пытался найти его, не мог найти решение. Если уже есть подобный вопрос, извините, не смог его найти.
Спасибо за помощь!
Может быть, вы могли бы обернуть вызов в функцию, которую вы вызываете с помощью 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
проверит, был ли токен уже определен, и в этом случае этот раздел будет проигнорирован.
Какой-то программист был прав, проблем с компоновкой + макросами нет.
После попытки воссоздать минимальный пример, чтобы опубликовать его здесь, я понял, что в CMakeLists.txt была ошибка, из-за которой main.cpp (в котором я расширил макрос easylogging ++) был исключен из сборки при некоторых обстоятельствах.
Спасибо всем за потраченное время и извините за глупый вопрос.