Algunas preguntas sobre GCC

Iniciado por Usuario887, 15 Abril 2021, 17:13 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Hola,

¿Es GCC un compilador o un linker?
Tengo entendido que son programas diferentes, sin embargo un codigo fuente puede ser compilado y enlazado con el comando simple gcc prog.c -o prog.exe

¿Existe una opcion -l que especifica una libreria como archivo por separado, o cuando se especifica por ejemplo -lwinhttp esta libreria esta integrada de antemano en gcc.exe?

Eternal Idol

Es un compilador, normalmente estos por defecto llaman al enlazador, salvo que se les pase un modificador para no hacerlo.

Cita de: WikipediaGCC's external interface follows Unix conventions. Users invoke a language-specific driver program (gcc for C, g++ for C++, etc.), which interprets command arguments, calls the actual compiler, runs the assembler on the output, and then optionally runs the linker to produce a complete executable binary.

Esa es una libreria de importacion y es un archivo .a (o .lib en VC++) que podes encontrar entre los subdirectorioes del entorno que hayas instalado.




Siempre es mejor usar las herramientas nativas (Xcode en macOS, Visual Studio en Windows, etc.): https://visualstudio.microsoft.com/vs/community/
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

BloodSharp

Cita de: marax en 15 Abril 2021, 17:13 PM¿Es GCC un compilador o un linker?
Según tengo entendido no es ninguno de los dos, es un programa "front-end" para el compilador y el enlazador...
Cita de: WikipediaLos usuarios llaman un programa controlador llamado gcc, que interpreta los argumentos dados, decide qué compilador usar para cada archivo y ejecuta el ensamblador con el código resultante, después posiblemente ejecuta el enlazador para producir un programa completo.

Cita de: marax en 15 Abril 2021, 17:13 PM¿Existe una opcion -l que especifica una libreria como archivo por separado, o cuando se especifica por ejemplo -lwinhttp esta libreria esta integrada de antemano en gcc.exe?
En sistemas GNU/Linux te enlaza con el shared object (.so) directamente (sin necesidad de librerías estáticas), sin embargo se puede utilizar con librerías estáticas también (.a)...

En cambio si estás utilizando por ejemplo MinGW, si o si necesitás las librerías estáticas que enlazan a las librerías dinámicas, en el caso de -lwinhttp, si es que existe, tendrías que encontrar la librería dinámica libwinhttp.a en el directorio \lib. Si no se encuentra se puede generar la librería estática libwinhttp.a manualmente con los exports que se requieran para enlazar tu programa con la librería dinámica o incluso utilizar las librerías estáticas .lib del Visual Studio. NOTA: Solo se pueden utilizar estáticas que enlazan a librerías dinámicas en este caso, no las que contienen código...


B#



@XSStringManolo

Cita de: marax en 15 Abril 2021, 17:13 PM
Hola,

¿Es GCC un compilador o un linker?
Tengo entendido que son programas diferentes, sin embargo un codigo fuente puede ser compilado y enlazado con el comando simple gcc prog.c -o prog.exe

¿Existe una opcion -l que especifica una libreria como archivo por separado, o cuando se especifica por ejemplo -lwinhttp esta libreria esta integrada de antemano en gcc.exe?
Es un conjunto de herramientas para compilar con soporte para múltiples lenguajes y arquitecturas. GNU Compiler Collection. Entre estas herramientas tienes un preprocesador, un linker, un compilador, debugger, etc.

Los distintos binarios y las librerías que añades a -l se buscan en distintos directorios del sistema.
En mi caso, termux y clang, puedo ver las rutas con el comando clang -print-search-dirs

Y muestra:
programs: /bin/

libraries: /lib/clang/11.1.0/
/lib/
/system/lib64/

Ahí es donde están las librerías. Los compiladores incluyen algunas librerías básicas. Algunos programas también instalan sus librerías al instalar el programa con un paquete. Otras las tienes que instalar explícitamente, otras necesitas el código fuente del programa sin compilar para usarlas. Otras vienen con el propio sistema operativo. Etc.

Usuario887

Quedo claro. Gracias por sus respuestas.

MinusFour

Cita de: @XSStringManolo en 15 Abril 2021, 19:33 PM
Es un conjunto de herramientas para compilar con soporte para múltiples lenguajes y arquitecturas. GNU Compiler Collection. Entre estas herramientas tienes un preprocesador, un linker, un compilador, debugger, etc.

Los distintos binarios y las librerías que añades a -l se buscan en distintos directorios del sistema.
En mi caso, termux y clang, puedo ver las rutas con el comando clang -print-search-dirs

Y muestra:
programs: /bin/

libraries: /lib/clang/11.1.0/
/lib/
/system/lib64/

Ahí es donde están las librerías. Los compiladores incluyen algunas librerías básicas. Algunos programas también instalan sus librerías al instalar el programa con un paquete. Otras las tienes que instalar explícitamente, otras necesitas el código fuente del programa sin compilar para usarlas. Otras vienen con el propio sistema operativo. Etc.

El linker no es técnicamente parte de GCC, es parte de binutils, gdb tampoco es parte de GCC. Por cierto, clang es LLVM no GCC.

En este caso yo creo que estas utilizando o Cygwin o MinGW para compilar el código. Por lo que veo de la documentación de Cygwin parece que GNU Linker si puede crear DLLs y puede linkear contra DLLs. No me queda claro el orden que usa GNU Linker en este caso.... Por lo general, en Linux busca por archivos .so o .a, no se si usando Cygwin solo use .dll o .lib o si use también .so o .a.

Esa es la belleza de GCC, que puede usar multiples front-ends para compilar código.

A decir verdad, tampoco me queda claro si el linker que se usa en Cygwin es ld (GNU Linker), un port o un linker parecido. Yo creo que si pero el proceso no es el común que te encuentras con ELFs.