Я пишу в C ++ под XCode 4.6 на Mountain Lion. Я пытаюсь добавить и использовать библиотеку Apache log4cxx. Я установил библиотеку сегодня утром с помощью Brew. Я ссылаюсь на liblog4cxx.dylib. Я получаю сообщение об ошибке, что не может быть найден только один символ:
Неопределенные символы для архитектуры x86_64:
«log4cxx :: Logger :: forcedLog (log4cxx :: хелперы :: ObjectPtrT
Const&, std :: __ 1 :: basic_string,
std :: __ 1 :: allocator> const&, log4cxx :: spi :: LocationInfo const&)
const «, ссылка на которую:
Я знаю, что он находит файл библиотеки, потому что, если я удаляю его, я получаю гораздо больше неопределенных ошибок символов, связанных с log4cxx.
соответствующий код в основном:
#include <log4cxx/logger.h>
static LoggerPtr logger(log4cxx::Logger::getLogger("foo.bar.Baz"));
void foo(int p1, int p2)
{
LOG4CXX_WARN(logger, "blah blah blah");
}
Создание объекта функции регистрации внутри функции, как статического, так и нет, не меняет поведение. Кроме того, связь со статической библиотекой, с определением или без определения LOG4CXX_STATIC в моем проекте, не меняет поведение.
Глядя на макрос, который я вызываю, я вижу, что этот символ является фактическим методом, который выполняет операцию регистрации. Если убрать вызов регистрации, но оставить в коде, который определяет объект регистратора, код связывается нормально, как вы могли ожидать.
Что мне нужно сделать, чтобы разрешить этот последний символ?
ТИА!
Я проследил свою проблему до компиляции библиотеки не компилятором C ++ 11, но тогда моим целевым проектом был компилятор C ++ 11.
Мне удалось скомпилировать log4cxx в компиляторе C + 11, просмотрев изменения в log4cxx в git-репозитории разработки, который в основном состоял из вставки static_casts, как в этом обновлении:
Я полагаю, что несколько несовместимых подпрограмм оказались неопределенными, поэтому нас запутали только несколько, казалось бы, случайных неопределений. (Или я все равно был)
Других решений пока нет …