es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 v;
// 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

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El símbolo relacionado con cxx17 que aparece al ejecutar nm demo | grep cxx17 proviene de la biblioteca de estándar C++ libstdc++ utilizada por g++. Aunque el archivo CMakeLists.txt establece explícitamente el estándar C++ en cxx_std_14, la biblioteca libstdc++ en sí misma admite características más allá del C++14. Cuando se usa el contenedor std::vector con el método shrink_to_fit, se involucra la función _M_realloc_insert, que está implementada en libstdc++. Esta función utiliza una nueva característica introducida en C++17 llamada std::pmr::polymorphic_allocator. Esta característica es compatible con la biblioteca libstdc++ incluso al compilar con la bandera cxx_std_14, lo que explica la aparición del símbolo cxx17 en la salida de nm.

Comments are closed.