Ваша проблема в том, что вы не определили метод Log
(он же Logger::Log
). Вы объявили это, но нигде не определили.
Другая небольшая проблема заключается в том, что вы действительно должны объявить это так:
void Log(const ::std::string &message);
Нет особой причины заставлять абонентов делать копию строки, которую они вам передают.
Есть несколько возможностей, которые могут объяснить, почему вы думаете, что оно определено, даже если это не так.
Во-первых, вы не можете ссылаться в соответствующем файле .o
, соответствующем файлу .cpp
, где определена функция. Это означает, что вы определили его, но компоновщик не знает о вашем определении.
Другая возможность состоит в том, что вы определили функцию с похожим именем, которое не совпадает с вызываемой функцией.
Другая возможность состоит в том, что вы определили функцию как встроенную. Если функция определена как встроенная, возможно, компилятор не выпустил код для нее. Многие компиляторы выдают код для встроенной функции только в том случае, если определение доступно в тот момент, когда на него ссылаются, а для справки требуется, чтобы функция имела действительный код где-то (например, получая ее адрес).
Если у вас есть функция, в которой определение встроено, эта функция обычно должна находиться в заголовочном файле, в противном случае ключевое слово inline
бесполезно и может даже вызвать проблемы, поскольку весь остальной код будет предполагать фактический код, находящийся по определенному адресу, поддерживающему ваше объявление функции, за исключением одного файла .cpp
, в котором он появляется, который может не ссылаться на функцию таким образом, чтобы принудительно вызывать код.