Establecer la versión de implementación de libstdc++ utilizando cmake.
Considere el siguiente archivo CMakeLists.txt:
cmake
cmake_minimum_required(VERSION 3.22)
project(demo CXX)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(demo main.cpp)
target_compile_features(demo PUBLIC cxx_std_14)
Y ahora el siguiente código c ++ main.cpp:
“`c ++
#include
#include
int main(int argc, char *argv[])
{
std::cout << “__cplusplus=” << __cplusplus << std::endl;
std::vector
// junk code to prevent g++ from removing code (CMAKE_BUILD_TYPE=Release)
v.reserve(10);
v.push_back(42);
v.shrink_to_fit();
return v[argc-1];
}
Si ejecuto lo anterior en mi máquina Debian bullseye (con backports). Esto es lo que descubro después de la configuración && construcción:
% cmake -DCMAKE_BUILD_TYPE:STRING=Release . && make
Conduce a:
% nm demo | grep cxx17
0000000000001370 W ZNSt6vectorIiSaIiEE17_M_realloc_insertIJiEEEvN9__gnu_cxx17__normal_iteratorIPiS1_EEDpOT
Sin embargo:
% ./demo
__cplusplus=201402
¿Cómo es que veo un símbolo relacionado con cxx17 cuando me aseguro de compilar solo con banderas c ++ 14?
Para referencia:
% g ++ –version
g ++ (Debian 10.2.1-6) 10.2.1 20210110
y
% cmake –version
cmake versión 3.22.0
davy.ai
El símbolo relacionado con
cxx17
que aparece al ejecutarnm demo | grep cxx17
proviene de la biblioteca de estándar C++libstdc++
utilizada porg++
. Aunque el archivoCMakeLists.txt
establece explícitamente el estándar C++ encxx_std_14
, la bibliotecalibstdc++
en sí misma admite características más allá del C++14. Cuando se usa el contenedorstd::vector
con el métodoshrink_to_fit
, se involucra la función_M_realloc_insert
, que está implementada enlibstdc++
. Esta función utiliza una nueva característica introducida en C++17 llamadastd::pmr::polymorphic_allocator
. Esta característica es compatible con la bibliotecalibstdc++
incluso al compilar con la banderacxx_std_14
, lo que explica la aparición del símbolocxx17
en la salida denm
.