2015-07-28 2 views
1

Я использую log4cxx, он работал нормально для моих нужд. Мы переходим к VS 2015, и я обнаружил, что компилятор в Visual Studio 2015 бросает ошибки при попытке перестроить log4cxx 0.10.0.1. Сборка по-прежнему работает, если я изменяю набор инструментов проекта на Visual Studio 2013 (v120), но когда я пытаюсь использовать его, у него есть проблемы во время выполнения.
См. Ниже сообщение об ошибке, которое встречается несколько раз. Кто-нибудь нашел способ правильно построить log4cxx с Visual Studio 2015?Как построить log4cxx в Visual Studio 2015

4>..\..\Log4cxx\log4cxx\apache-log4cxx-0.10.0\src\main\include\log4cxx/layout.h(90): error C2248: 'log4cxx::helpers::ObjectImpl::ObjectImpl': cannot access private member declared in class 'log4cxx::helpers::ObjectImpl' 
4>..\..\Log4cxx\log4cxx\apache-log4cxx-0.10.0\src\main\include\log4cxx/helpers/objectimpl.h(43): note: see declaration of 'log4cxx::helpers::ObjectImpl::ObjectImpl' 
4>..\..\SDKS\Log4cxx\log4cxx\apache-log4cxx-0.10.0\src\main\include\log4cxx/helpers/objectimpl.h(28): note: see declaration of 'log4cxx::helpers::ObjectImpl' 
4>..\..\SDKS\Log4cxx\log4cxx\apache-log4cxx-0.10.0\src\main\include\log4cxx/layout.h(90): note: This diagnostic occurred in the compiler generated function 'log4cxx::Layout::Layout(const log4cxx::Layout &)' 
+0

Показать определения классов. – harper

ответ

2

У меня была такая же проблема, и я нашел исправление.

Проблема заключается в определении базового класса ObjectImpl:

class LOG4CXX_EXPORT ObjectImpl : public virtual Object 
    { 
    public: 
     ObjectImpl(); 
     virtual ~ObjectImpl(); 
     void addRef() const; 
     void releaseRef() const; 

    protected: 
     mutable unsigned int volatile ref; 

    private: 
     // 
     // prevent object copy and assignment 
     // 
     ObjectImpl(const ObjectImpl&); 
     ObjectImpl& operator=(const ObjectImpl&); 
    }; 

Как вы можете видеть класс скрывает конструктор копирования и оператор присваивания копии, потому что дизайн с использованием эталонного счетчика не имеет подходящую реализации. Было бы лучше использовать общие указатели.

Новая реализация stl использует семантику перемещения для своих классов коллекции, а когда нет конструктора копирования и оператора присваивания копий с семантикой перемещения, он должен использовать стандартные операторы, которые недоступны.

Для решения этой проблемы нам необходимо добавить операторы перемещения в следующие классы: ObjectImpl, Layout, Filter, PatternConverter, TriggeringPolicy и RollingPolicyBase.

Вот моя новая реализация для ObjectImpl:

class LOG4CXX_EXPORT ObjectImpl : public virtual Object 
    { 
    public: 
     ObjectImpl(); 
     virtual ~ObjectImpl(); 
     void addRef() const; 
     void releaseRef() const; 

     // added for VS2015 
     ObjectImpl(ObjectImpl && o) 
     { 
      ref = o.ref; 
      o.ref = 0; 
     } 

     ObjectImpl& operator=(ObjectImpl && o) 
     { 
      ref = o.ref; 
      o.ref = 0; 

      return *this; 
     } 
     // ----- 

    protected: 
     mutable unsigned int volatile ref; 

    private: 
     // 
     // prevent object copy and assignment 
     // 
     ObjectImpl(const ObjectImpl&); 
     ObjectImpl& operator=(const ObjectImpl&); 
    }; 

И еще один пример. Остальные классы аналогичны:

class LOG4CXX_EXPORT Filter : public virtual OptionHandler, 
     public virtual helpers::ObjectImpl 
    { 
     /** 
     Points to the next filter in the filter chain. 
     */ 
     FilterPtr next; 
    public: 
     Filter(); 

     // added for VS2015 
     Filter(Filter && o) 
      : helpers::ObjectImpl(std::move(o)) 
      , next(o.next) 
     { } 

     Filter& operator=(Filter && o) 
     { 
      helpers::ObjectImpl::operator=(std::move(o)); 
      next = o.next; 
      return *this; 
     } 
     // end of added for VS2015 

     ... 

Я надеюсь, что это поможет.

+0

Спасибо Дирк. Очень хорошее объяснение, и все это работает для меня очень хорошо. – Nik

+0

Не может быть мгновенно очевидным, но вам нужно будет добавить конструктор по умолчанию для (Layout, TriggeringPolicy). Также в PatternConverter спецификатор const должен быть удален из имени и стиля поля, иначе оператор присваивания не будет компилироваться. – Petro

+0

@Nik Можете ли вы опубликовать изменения в других классах, которые вы сделали? – Neeraj

0

Коллега имел эту проблему, и он решил ее, перейдя в File>New>Project>Visual C++ и выбор Install Windows XP Support for C++. Как ни странно, я никогда этого не делал, но у меня тоже никогда не было той же проблемы.