Вызов макроса только один раз в проекте

Я пытаюсь настроить easylogging++ в проекте, и я столкнулся со следующей проблемой:

макрос INITIALIZE_EASYLOGGINGPP следует вызывать только один раз в проекте. Теперь, если я вызову этот макрос из моего main.cpp и включать только easylogging++.h в main.cpp — все работает отлично. Тем не менее, когда я пытаюсь включить easylogging++.h в большем .cpp файлы, я получаю проблемы компоновщика с неопределенными ссылками (как будто макрос не был вызван).
Если я помещу вызов этого макроса в файл в алфавитном порядке перед main.cpp, линкер разрешает все нормально. На этапе связывания объекты сортируются в алфавитном порядке.

Есть хороший способ решить эту проблему? Или мне придется пытаться форсировать другой порядок файлов во время компоновки?

Я не очень опытен в подобных проблемах, пытался найти его, не мог найти решение. Если уже есть подобный вопрос, извините, не смог его найти.

Спасибо за помощь!

0

Решение

Может быть, вы могли бы обернуть вызов в функцию, которую вы вызываете с помощью std::call_once(), например:

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

Таким образом, вы можете позвонить setup_logging() несколько раз, но макрос вызывается один раз.

1

Другие решения

#ifndef INITIALIZE_EASYLOGGINGPP
#define INITIALIZE_EASYLOGGINGPP SomeLogic
#endif

#ifndef проверит, был ли токен уже определен, и в этом случае этот раздел будет проигнорирован.

0

Какой-то программист был прав, проблем с компоновкой + макросами нет.

После попытки воссоздать минимальный пример, чтобы опубликовать его здесь, я понял, что в CMakeLists.txt была ошибка, из-за которой main.cpp (в котором я расширил макрос easylogging ++) был исключен из сборки при некоторых обстоятельствах.

Спасибо всем за потраченное время и извините за глупый вопрос.

0
По вопросам рекламы [email protected]