Estoy aprendiendo C (todavía muy principiante) en Linux usando el compilador GCC. He notado que algunas bibliotecas, como la biblioteca utilizada con el math.h
encabezado, deben vincularse manualmente cuando se incluyen. Me he estado vinculando en las bibliotecas usando varios indicadores del formulario -l[library-name]
, como -lm
para la biblioteca matemática mencionada anteriormente.
Sin embargo, después de cambiar desde la línea de comando y / o Geany
hacia Code::Blocks
, noté que se Code::Blocks
usa g++
para compilar los programas en lugar de los gcc
que estoy acostumbrado (a pesar de que el proyecto se especifica definitivamente como C). Además, Code::Blocks
no requiere que las bibliotecas se vinculen manualmente al compilar, las bibliotecas como la biblioteca matemática simplemente funcionan .
Tengo dos preguntas:
En primer lugar, ¿es "malo" compilar programas C con el g++
compilador? Hasta ahora parece funcionar, pero después de todo, C ++ no es C y estoy bastante seguro de que el g++
compilador está destinado a C ++.
En segundo lugar, ¿es el g++
compilador el que está haciendo el enlace automático de las bibliotecas Code::Blocks
?
Respuestas:
Tanto gcc como g ++ son interfaces para la colección del compilador GNU. Debe usar el primero para compilar y vincular el código C, y el último para realizar las mismas acciones en el código C ++. Uno de los argumentos más fuertes para mantener la distinción es que C no es un subconjunto de C ++ .
Si vincula usando g ++, se vinculará automáticamente en la biblioteca estándar de C ++. Dado que la biblioteca estándar de C es parte de la biblioteca estándar de C ++, también se incluye la biblioteca matemática. Es por eso que no necesita vincular manualmente la biblioteca matemática.
fuente
Definir "malo".
Hay algunas cosas que pueden hacer que un programa de C válido se compile en C ++ con una semántica diferente, si mi experiencia es pertinente, tiene más posibilidades de encontrar UB manejado de manera diferente al cambiar la versión de su compilador de C que encontrarse con ellos.
Un compilador C ++ no compilará algunos programas C válidos, por lo que compilar C con un compilador C ++ lo restringirá a su subconjunto común, que es una versión más estricta de C. Restringirse a ese dialecto C no es idiomático (la principal diferencia es necesita lanzar void * cuando se necesita otro tipo de puntero), pero algunos proyectos comenzaron a usar C ++ de esa manera. Ellos usaron un compilador de C ++ para obtener una versión más segura de C y luego decidieron permitir el uso de las características adicionales, una por una, ya que las consideraron pertinentes. (El ejemplo más reciente y más público es el propio gcc. GCC comenzó a escribirse en K&R C, luego ordenó un compilador ANSI C, luego se restringió al subconjunto común de ANSI C y C ++, y ahora están comenzando a usar C ++, otro Un ejemplo bastante público es que los ejemplos en la segunda edición de K &
Tenga en cuenta que si solo usa compiladores de C ++, introducirá rápidamente las dependencias de C ++ en él.
Tenga en cuenta también que las cosas nuevas en C99 y C11 están más sujetas a ser diferentes en C ++.
Cuando se usa para vincular, un compilador siempre vincula un conjunto predeterminado de bibliotecas. Ese conjunto para gcc no incluye libm, está incluido en el conjunto predeterminado para g ++. G ++ no detectará automáticamente bibliotecas adicionales si son necesarias (AFAIK tampoco Code :: Blocks),
libm
es un caso muy particular (algunos argumentarán que el hecho de que gcc no lo vincula por defecto es un error en gcc).fuente