Пользовательский GCC 4.8.2 на RHEL6 выдает ошибку сборки с std::shared_ptr

Я использую CMake 2.8.11 и GCC 4.8.2. Я создавал некоторый код C++, который использовал std::shared_ptr, который отлично строился в MS VS 2012, но когда я попробовал то же самое на RHEL6, используя GCC 4.8.2, я сразу же столкнулся со следующей ошибкой:

error: 'shared_ptr' is not a member of 'std'

Я нашел этот вопрос с ответами, которые, по моему мнению, были адресованы, и сразу же добавил -std=c++11 к мой CMAKE_CXX_FLAGS, но я все еще продолжаю сталкиваться с ошибкой. Я добавляю флаг в CMake, просто используя:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" CACHE STRING "Add C++ 11 flags")

Я установил свой собственный компилятор в CMake, используя:

SET(GCC_DIR "</path/to/custom>/gcc")
SET(CMAKE_CXX_COMPILER "${GCC_DIR}/bin/g++ CACHE FILEPATH "CXX compiler")
SET(CMAKE_C_COMPILER "${GCC_DIR}/bin/gcc CACHE FILEPATH "C compiler")

Включение это

#include <memory>

что в свою очередь имеет

#include <bits/shared_ptr.h>

который определяет класс shared_ptr. Поэтому я не уверен, почему я продолжаю получать ошибку (и да, я очистил кеш и перестроил после добавления параметра компилятора -std=c++11). Любые идеи очень ценятся.

ИЗМЕНИТЬ 1:

Я создал простую программу (main.cpp) следующим образом:

#include <memory>
#include <iostream>

int main() {
  std::shared_ptr<int> pint = std::make_shared<int>();
  std::cout << "Pint points to " << pint.get() << "\n";
  return 0;
}

Затем я построил его с помощью <path/to/custom/>g++ main.cpp -o prog и тут же столкнулся с той же ошибкой (см. выше). Затем я сделал: <path/to/custom/>g++ -std=c++11 main.cpp -o prog и он компилируется и работает нормально. Для моего реального приложения я также добавил флаг -std=c++11 к флагам компоновщика (в дополнение к флагам компилятора) в моей системе конфигурации CMake, но я все еще вижу ту же ошибку. Приступаем к проверке CMakeCache, чтобы убедиться, что флаги зарегистрированы как собственность, но любые идеи приветствуются.

ИЗМЕНИТЬ 2:

Удивительно, но я обнаружил в CMakeCache, что флаг -std=c++11 не добавляется к CMAKE_CXX_FLAGS и т. д. Так что это должно быть связано с ошибкой. Я пытаюсь исправить это так, чтобы он действительно принимал этот флаг. Спасибо всем.


person squashed.bugaboo    schedule 07.01.2016    source источник
comment
Попробуйте с -std=c++0x. Это может работать, поскольку некоторые компиляторы используют это вместо -std=c++11.   -  person Celine NOEL    schedule 08.01.2016
comment
На самом деле я попробовал это первым, и это не сработало. Но в ссылке, на которую я ссылался, упоминалось об использовании c++11 для GCC › 4.7, и я так и сделал, но даже это не сработало.   -  person squashed.bugaboo    schedule 08.01.2016
comment
RHEL6 поставляется с гораздо более старой версией gcc, вы уверены, что на самом деле вызываете gcc 4.8.2 и что он правильно установлен?   -  person nos    schedule 08.01.2016
comment
Давайте также посмотрим cmakelists.txt.   -  person Celine NOEL    schedule 08.01.2016
comment
@nos: Это хороший момент. Да, я использую GCC 4.8.2, это точно. Все приложение построено с помощью специального компилятора GCC 4.8.2, установленного на RH6. Установкой компилятора не занимался. Как вы думаете, это может быть проблемой?   -  person squashed.bugaboo    schedule 08.01.2016
comment
@squashed.bugaboo Кажется, да. Можете ли вы хотя бы убедиться, что вы вызываете этот специально установленный gcc, а не gcc v 4.4 по умолчанию?   -  person nos    schedule 08.01.2016
comment
@nos: Да, смотрите мой отредактированный комментарий.   -  person squashed.bugaboo    schedule 08.01.2016
comment
Ваш путь включения предназначен для gcc 4.4, но вы используете gcc 4.8.2. Я настоятельно рекомендую использовать devtools-2 на CentOS 6/RHEL 6. wget people.centos.org/tru/devtools-2/devtools-2.repo -O /etc/yum.repos.d/devtools-2.repo && yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++ && scl включить devtoolset-2 bash   -  person Brian Cannard    schedule 08.01.2016
comment
Тогда можно попытаться сузить круг. Создайте один файл example.cpp, который использует std::shared_ptr, скомпилируйте его вручную, запустив g++ -Wall -std=c++11 example.cpp, запустите g++ -v, чтобы просмотреть его версию. Если это не сработает, проблема с вашей установкой gcc, если она работает, это проблема с вашей системой сборки.   -  person nos    schedule 08.01.2016
comment
@nos: Спасибо, это звучит как хорошая идея. Что вы имели в виду под запуском g++ -v для просмотра версии? Если запустить его с помощью g++ из пользовательского компилятора, я знаю, что увижу 4.8.2, так что это замечание кажется неуместным. Не будет ли достаточно просто скомпилировать пример программы с помощью специального компилятора?   -  person squashed.bugaboo    schedule 08.01.2016
comment
Запустите g++ -v, и он распечатает информацию о версии.   -  person Mats Petersson    schedule 08.01.2016
comment
@avesus: я указал CMake путь к моему пользовательскому каталогу GCC и компиляторам; поэтому я включаю правильные заголовки в предполагаемый путь включения, предполагая, что CMake делает то, что должен.   -  person squashed.bugaboo    schedule 08.01.2016
comment
Нет, это замечание не к месту. Если кто-то установил пользовательский g++, он, надеюсь, сделал это таким образом, чтобы не конфликтовать с обычной установкой gcc RHEL. Это означает, что ваш PATH должен быть каким-то образом изменен, чтобы вы могли вызвать g++ и получить gcc 4.8.2, и если вы каким-то образом находитесь в оболочке, в которой нет этого измененного PATH, или в ваших файлах cmake есть вещи, воздействующие на PATH, ваш предположения могут быть ошибочными при компиляции предложенного примера example.cpp. Конечно, это было до того, как мы узнали, что вы уже установили правильный PATH, поскольку все, что вы сказали нам, это то, что вы запустили g++. Тем не менее, всегда проверяйте предположения.   -  person nos    schedule 08.01.2016
comment
@nos: я добавил еще несколько заметок о том, как это делается в CMake. Но я все еще не вижу смысла запускать g++ -v; если бы я сделал именно это, то да, я бы увидел 4.4.7 или что-то еще по умолчанию с RHEL6; но наша среда настроена на использование GCC 4.8.2 для сборки приложения (опять же, см. фрагмент выше). Так что я не вижу, что запуск g++ -v может сказать мне, чего я еще не знаю. Но да, компиляция небольшой тестовой программы полезна.   -  person squashed.bugaboo    schedule 08.01.2016
comment
Вы можете пропустить его запуск, это было просто предложение, чтобы вы действительно были уверены в том, что происходит. хотя я не понимаю, зачем вам это нужно, это займет максимум секунду. Но, пожалуйста, создайте простой пример и запустите g++ вручную, чтобы вы могли проверить, виноват ли компилятор или cmake.   -  person nos    schedule 08.01.2016
comment
Я настоятельно рекомендую запускать оболочку с scl enable devtoolset-2 bash. Он устанавливает PATH соответствующим образом.   -  person Brian Cannard    schedule 08.01.2016


Ответы (1)


Ответ подтверждает догадку в EDIT 2 моего вопроса. По-видимому, CMake 2.8.x не добавляется к переменной CMAKE_CXX_FLAGS с помощью команды SET с использованием синтаксиса, показанного в моем вопросе (согласно документации); Я пробовал другие варианты команды SET для добавления, но безрезультатно.

Итак, наконец, вместо добавления я назначил отдельно для случая, когда С++ 11 должен быть включен и когда он должен быть отключен, следующим образом:

IF(USE_C++11)
...
ELSE(USE_C++11)
...
ENDIF(USE_C++11)

Это сработало нормально. Спасибо @nos за идею сделать отдельный пример.

person squashed.bugaboo    schedule 11.01.2016