Preguntas sobre vincular bibliotecas en C

8

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.hencabezado, deben vincularse manualmente cuando se incluyen. Me he estado vinculando en las bibliotecas usando varios indicadores del formulario -l[library-name], como -lmpara la biblioteca matemática mencionada anteriormente.

Sin embargo, después de cambiar desde la línea de comando y / o Geanyhacia Code::Blocks, noté que se Code::Blocksusa g++para compilar los programas en lugar de los gccque estoy acostumbrado (a pesar de que el proyecto se especifica definitivamente como C). Además, Code::Blocksno 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?

James
fuente
1
Supongo que Code: Blocks establece algunas variables de entorno para buscar rutas para la biblioteca en su entorno de compilación o agrega esta información cuando llama al compilador. Puede obtener resultados similares en la línea de comandos. Lo más probable es que haya algunas opciones de configuración en Code: Blocks donde puede definir dichos detalles sobre su entorno de construcción. Si coloca información similar en .bashrc (o alguna otra secuencia de comandos ini), obtendría los mismos resultados. Tal vez establezca Código: Bloquea la salida de compilación a verbosa (si eso es posible) para ver qué hace exactamente.
thorsten müller
Supongo que este enlace le dará algo de ayuda por lo que, al compilar con g ++, no necesitamos vincular manualmente la biblioteca de matemáticas: stackoverflow.com/questions/1033898/…

Respuestas:

6

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.

otón
fuente
3

En primer lugar, ¿es "malo" compilar programas en C con el compilador g ++?

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 ++.

En segundo lugar, ¿es el compilador de g ++ el que está haciendo el enlace automático de las bibliotecas en Code :: Blocks?

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), libmes un caso muy particular (algunos argumentarán que el hecho de que gcc no lo vincula por defecto es un error en gcc).

Un programador
fuente
+1 para "algunos argumentarán que el hecho de que gcc no lo vincula por defecto es un error en gcc". Me encontré con el mismo problema, con la misma biblioteca, y vine a preguntar cuál era la diferencia entre los dos compiladores.
Sr. Lister