Quando tento executar um makefile gerado pelo CMake para compilar meu programa, recebo o erro que
o intervalo baseado em loops não é suportado no modo C ++ 98.
Tentei adicionar add_definitions(-std=c++0x)
ao meu CMakeLists.txt
, mas não ajudou.
Eu tentei isso também:
if(CMAKE_COMPILER_IS_GNUCXX)
add_definitions(-std=gnu++0x)
endif()
Quando eu faço g++ --version
, recebo:
g ++ (Ubuntu / Linaro 4.6.1-9ubuntu3) 4.6.1
Eu também tentei SET(CMAKE_CXX_FLAGS "-std=c++0x")
, o que também não funciona.
Não entendo como posso ativar os recursos do C ++ 11 usando o CMake.
SET(CMAKE_CXX_FLAGS "-std=c++0x")
fino trabalha para mim, então provavelmente há um problema em algum outro lugar no arquivo CMakeLists. Certifique-se de não substituir acidentalmente o conteúdo de CMAKE_CXX_FLAGS posteriormente.set(CMAKE_CXX_STANDARD 11)
(antes de definir o alvo) é o melhor caminho.CXX_STANDARD
faz não trabalho em MSVC, então basicamente você tem que cair de volta paratarget_compile_features
se você quer algo que funciona em várias plataformas.Respostas:
O CMake 3.1 introduziu a variável CMAKE_CXX_STANDARD que você pode usar. Se você sabe que sempre terá o CMake 3.1 disponível, basta escrevê-lo no seu arquivo CMakeLists.txt de nível superior ou corrigi-lo antes que qualquer novo destino seja definido:
Se você precisar oferecer suporte a versões mais antigas do CMake, aqui está uma macro que você pode usar:
A macro suporta apenas o GCC no momento, mas deve ser simples expandi-la para outros compiladores.
Em seguida, você pode escrever
use_cxx11()
na parte superior de qualquer arquivo CMakeLists.txt que defina um destino que use C ++ 11.Problema no CMake # 15943 para usuários de clang que segmentam o macOS
Se você estiver usando o CMake e clang para segmentar o macOS, há um erro que pode fazer com que o
CMAKE_CXX_STANDARD
recurso simplesmente não funcione (não adicione nenhum sinalizador do compilador). Certifique-se de executar um dos seguintes procedimentos:Defina a política CMP0025 como NEW com o seguinte código na parte superior do arquivo CMakeLists.txt antes do
project
comando:fonte
gnu++11
imposição, mesmo quando essas variáveis são definidasset(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION clang)
set(CMAKE_ANDROID_STL_TYPE c++_static)
. Para mim, o único caminho viável era o clássicoset (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
O comando CMake
target_compile_features()
é usado para especificar o recurso C ++ necessáriocxx_range_for
. O CMake induz o padrão C ++ a ser usado.Não há necessidade de usar
add_definitions(-std=c++11)
ou modificar a variável CMakeCMAKE_CXX_FLAGS
, porque o CMake garantirá que o compilador C ++ seja chamado com os sinalizadores de linha de comando apropriados.Talvez o seu programa C ++ use outros recursos do C ++ que não
cxx_range_for
. A propriedade global CMakeCMAKE_CXX_KNOWN_FEATURES
lista os recursos do C ++ que você pode escolher.Em vez de usar,
target_compile_features()
você também pode especificar explicitamente o padrão C ++, definindo as propriedades do CMakeCXX_STANDARD
eCXX_STANDARD_REQUIRED
para o seu destino no CMake.Veja também minha resposta mais detalhada .
fonte
estou usando
Mas se você quiser brincar
C++11
,g++ 4.6.1
é bem antigo. Tente obter umag++
versão mais recente.fonte
CXX_STANDARD
respostas baseadas em votos , mas essa foi a única resposta útil na minha situação.A maneira mais fácil de definir o padrão Cxx é:
Consulte a documentação do CMake para obter mais detalhes.
fonte
set(CMAKE_CXX_STANDARD 11)
definir a propriedade padrão para todos os destinos criados depois disso.set
comando sugerido por @emlai é global e afeta todos os destinos subsequentes.Como se vê,
SET(CMAKE_CXX_FLAGS "-std=c++0x")
ativa muitos recursos do C ++ 11. O motivo pelo qual não funcionou foi que a declaração era assim:Seguindo essa abordagem, de alguma forma a
-std=c++0x
bandeira foi substituída e não funcionou. Definir os sinalizadores um por um ou usar um método de lista está funcionando.fonte
CXX_STANDARD
propriedade é melhor, pois é independente do compilador.O jeito mais fácil:
add_compile_options(-std=c++11)
fonte
Para o CMake 3.8 e mais recente, você pode usar
fonte
PUBLIC
daqui?PUBLIC
significa que outros destinos que dependem do seu destino também usarão o C ++ 11. Por exemplo, se o seu destino for uma biblioteca, todos os destinos vinculados à sua bibliotecatarget_link_libraries
serão compilados com o suporte ao C ++ 11.Essa é outra maneira de ativar o suporte ao C ++ 11,
Eu encontrei instâncias em que apenas esse método funciona e outros métodos falham. Talvez tenha algo a ver com a versão mais recente do CMake.
fonte
add_definitions
deve ser usado apenas para adicionar DEFINIÇÕES, ou seja, -D ALGO. E como o @Emmanuel disse, isso não funciona em muitos casos.add_definitions
não foi criado para definir sinalizadores.No CMake moderno (> = 3.1), a melhor maneira de definir requisitos globais é:
É traduzido como "Quero C ++ 11 para todos os destinos, não é opcional, não quero usar nenhuma extensão GNU ou Microsoft". A partir do C ++ 17, este ainda é o IMHO da melhor maneira.
Fonte: Habilitando o C ++ 11 e posterior no CMake
fonte
O que funciona para mim é definir a seguinte linha no seu CMakeLists.txt:
A configuração desse comando ativa os recursos do C ++ 11 para o compilador e, após a execução do
cmake ..
comando, você poderá usarrange based for loops
seu código e compilá-lo sem erros.fonte
-std=c++11
, poisset (CMAKE_CXX_STANDARD 11)
usará a bandeira-std=gnu++11
, o que pode ser indesejável.set (CMAKE_CXX_EXTENSIONS OFF)
Eu acho que apenas essas duas linhas são suficientes.
fonte
target_compile_features
função Cmake , aplicada a cada destino individual, como mostrado em outras respostas, é uma abordagem mais recomendada.Caso você deseje sempre ativar o padrão C ++ mais recente, aqui está minha extensão da resposta de David Grayson , à luz das recentes adições (CMake 3.8 e CMake 3.11) dos valores 17 e 20 para CMAKE_CXX_STANDARD (CMake 3.8 e CMake 3.11):
(Use esse código no lugar de
set (CMAKE_CXX_STANDARD 11)
na resposta vinculada.)fonte
O cmake moderno oferece maneiras mais simples de configurar os compiladores para usar uma versão específica do C ++. A única coisa que alguém precisa fazer é definir as propriedades de destino relevantes. Entre as propriedades suportadas pelo cmake , as usadas para determinar como configurar os compiladores para dar suporte a uma versão específica do C ++ são as seguintes:
CXX_STANDARD
define o padrão C ++ cujos recursos são solicitados para criar o destino. Defina isso como11
destino C ++ 11.CXX_EXTENSIONS
, um booleano que especifica se extensões específicas do compilador são solicitadas. Definir isso comoOff
desabilita o suporte a qualquer extensão específica do compilador.Para demonstrar, aqui está um exemplo de trabalho mínimo de a
CMakeLists.txt
.fonte
Relacionados com OS X e Homebrew LLVM:
Não se esqueça de chamar cmake_minimum_required (VERSÃO 3.3) e project () depois!
Ou o CMake será inserido
project()
implicitamente antes da linha 1, causando problemas na detecção da versão do Clang e possivelmente em outros tipos de problemas. Aqui está uma questão relacionada .fonte