Я использую 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
и т.д. Так что это должно быть связано с ошибкой. Я пытаюсь исправить это так, чтобы он на самом деле взял этот флаг. Спасибо всем.
Ответ подтверждает догадку РЕДАКТИРОВАТЬ 2 моего вопроса. По-видимому CMake 2.8.x
не добавляется к переменной CMAKE_CXX_FLAGS
с использованием SET
команда с использованием синтаксиса, показанного в моем вопросе (согласно документации); Я пробовал другие варианты SET
Команда добавить, но безрезультатно.
Итак, наконец, вместо добавления я назначил отдельно для случая, когда C ++ 11 должен быть включен и когда он должен быть отключен, следующим образом:
IF(USE_C++11)
...
ELSE(USE_C++11)
...
ENDIF(USE_C++11)
Это работало нормально. Спасибо @nos за идею сделать отдельный пример.
Других решений пока нет …