Preguntas sobre cómo enlazar bibliotecas en C

7

Estoy aprendiendo C (todavía un principiante) en Linux usando el compilador GCC. Me he dado cuenta de que algunas bibliotecas, como la que se usa con el encabezado math.h , deben vincularse manualmente cuando se incluyen. He estado enlazando en las bibliotecas utilizando varios indicadores de la forma -l[library-name] , como -lm para la biblioteca matemática mencionada anteriormente.

Sin embargo, después de pasar de la línea de comandos y / o Geany a Code::Blocks , noté que Code::Blocks usa g++ para compilar los programas en lugar del gcc al que estoy acostumbrado (aunque El proyecto se especifica definitivamente como C). Además, Code::Blocks no requiere que las bibliotecas se vinculen manualmente al compilar: bibliotecas como la biblioteca matemática simplemente funcionan .

Tengo dos preguntas:

En primer lugar, ¿es "malo" compilar programas en C con el compilador g++ ? Hasta ahora parece funcionar, pero después de todo, C ++ no es C y estoy bastante seguro de que el compilador g++ está destinado a C ++.

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

    
pregunta james 09.10.2012 - 11:01

2 respuestas

5

Tanto gcc como g ++ son las interfaces de 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 sólidos para mantener la distinción es que C no es un subconjunto de C ++ .

Si vinculas 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 ++, la biblioteca matemática también se incluye. Esta es la razón por la que no es necesario vincular manualmente la biblioteca matemática.

    
respondido por el otto 09.10.2012 - 11:25
2
  

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

Define "bad".

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 que la UB se maneja de manera diferente cuando se cambia la versión de su compilador de C que si se cumple. ellos.

Un compilador de C ++ no compilará algunos programas de C válidos, de modo que compilar C con un compilador de C ++ lo restringirá a su subconjunto común, que es una versión más estricta de C. Restringirse a ese dialecto de C no es idiomático (el principal la diferencia es la necesidad de anular * cuando se necesita otro tipo de puntero), pero algunos proyectos comenzaron a usar C ++ de esa manera. Ellos utilizaron un compilador de C ++ para obtener una versión de C más segura para el tipo y luego decidieron permitir el uso de las funciones adicionales, una por una, según lo consideraran pertinente. (El último y más público ejemplo es gcc en sí. GCC comenzó a escribirse en K & RC, luego ordenó un compilador ANSI C, luego se restringió al subconjunto común de ANSI C y C ++, y ahora están empezando a usar C ++, Otro ejemplo bastante público es que los ejemplos en la segunda edición de K & RC se compilaron con un compilador de C ++, pero creo que C ++ se ajustó ya que me parece que algunos ejemplos no se compilarán con un compilador de C ++ actual.

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 g ++ el que realiza 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, se incluye en el conjunto predeterminado para g ++. G ++ no detectará automáticamente bibliotecas adicionales si son necesarias (AFAIK tampoco lo hará Code :: Blocks), libm es un caso muy particular (algunos argumentarán que el hecho de que gcc no lo vincule de forma predeterminada es un error en gcc).

    
respondido por el AProgrammer 09.10.2012 - 13:52

Lea otras preguntas en las etiquetas