2015-06-15 3 views
3

Я пытаюсь скомпилировать библиотеку, написанную с помощью функций C++ 11 с использованием GCC 5.1 на Ubuntu. Однако он жалуется, что std::unique_ptr не определен.Невозможно скомпилировать исходный код C++ 11 с использованием инструментальной привязки GCC 5.1

gcc (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0 
g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0 

CXX флаги:

-std=c++11 -Wall -Wextra -Weffc++ -pedantic 

Выход:

error: ‘unique_ptr’ in namespace ‘std’ does not name a template type 
     std::unique_ptr<detail::RegexImpl> m_pimpl; 

Однако, я могу скомпилировать тот же код на OSX.

Apple LLVM version 6.1.0 (clang-602.0.49) (based on LLVM 3.6.0svn) 

CXX флаги:

-stdlib=libc++ -std=c++11 -Wall -Wextra -Weffc++ -pedantic 

Что я делаю неправильно?

+4

Пожалуйста, укажите источник. Вы включаете ''? –

+0

У меня не было проблем с gcc 5.1 на Ubuntu. Я скомпилировал его из источника, добавил include и lib путь к переменной env, и он работает. – bolov

+2

Похоже, вы полагаетесь на зависимые от реализации зависимости между заголовками. Не удивительно, что когда переносимый код ломается, когда вы пытаетесь его перенести, к счастью, это легко. –

ответ

11

Вы ничего не делаете неправильно. В источнике библиотеки отсутствует #include <memory>.

Это просто неудачная ошибка, высказанная автором библиотеки. Это удивительно обычное явление для людей to rely on certain standard headers just so happening to include other standard headers on their particular implementation, не проверяя, что они используют все операторы #include, которые они должны.

На данный момент вы можете взломать #include, но в долгосрочной перспективе вам следует поднять ошибку с автором библиотеки и, возможно, внести свой вклад в патч, если проект принимает исправления.

+0

Есть ли компилятор, который, как известно, использует минимальные включения?Или это лучшая стратегия для сопровождающего этой библиотеки, чтобы убедиться, что она использует несколько компиляторов C++, чтобы найти ошибки, подобные этой? –

+0

@BrianCain: Я не совсем уверен, как ответить на это, чтобы быть абсолютно честным. Моя личная стратегия - одна из _diligence_: всякий раз, когда я пишу стандартное имя библиотеки, которое я не совсем знаю, что я уже использовал в одной и той же единицы перевода, я просматриваю, с какого заголовка она появляется, и затем добавляю соответствующий '#include 'если его еще нет. Не может пойти не так, если вы это сделаете, хотя через некоторое время это немного утомительно. –

+0

Получил! Отправьте патч автору – Thijs