InglésFrancésEspañol

Ad


icono de página de OnWorks

makepp_tutorial_compilation: en línea en la nube

Ejecute makepp_tutorial_compilation en el proveedor de alojamiento gratuito de OnWorks a través de Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS

Este es el comando makepp_tutorial_compilation que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.

PROGRAMA:

NOMBRE


makepp_tutorial_compilation - Comandos de compilación de Unix

DESCRIPCIÓN


Omita esta página de este manual si comprende bien lo que hacen los comandos de compilación.

Encuentro que, angustiosamente, pocas personas parecen aprender en sus clases de programación cómo
para compilar programas una vez que los hayan escrito. Los novatos confían en un solo
comando memorizado, o de lo contrario en las reglas integradas en make. Me ha sorprendido
personas extremadamente alfabetizadas en informática que aprendieron a compilar sin optimización porque
simplemente nunca se les dijo lo importante que es. Conocimiento rudimentario de cómo la compilación
los comandos funcionan puede hacer que sus programas se ejecuten dos veces más rápido o más, por lo que vale la pena al menos
cinco minutos. Esta página describe casi todo lo que necesita saber para compilar C
o programas C ++ en casi cualquier variante de Unix.

Los ejemplos serán principalmente para C, ya que la compilación de C ++ es idéntica excepto que el nombre
del compilador es diferente. Suponga que está compilando código fuente en un archivo llamado
"xyz.c" y desea crear un programa llamado "xyz". ¿Qué debe pasar?

Es posible que sepa que puede construir su programa en un solo paso, usando un comando como este:

cc -g xyz.c -o xyz

Esto funcionará, pero oculta un proceso de dos pasos que debe comprender si está
escribir archivos MAKE. (En realidad, hay más de dos pasos, pero solo tienes que
entender dos de ellos.) Para un programa de más de un módulo, los dos pasos suelen ser
explícitamente separados.

Compilación
El primer paso es la traducción de su código fuente C o C ++ a un archivo binario llamado
un archivo de objeto. Los archivos de objeto suelen tener la extensión ".o". (Para algunos más recientes
proyectos, ".lo" también se usa para un tipo de archivo de objeto ligeramente diferente).

El comando para producir un archivo de objeto en Unix se parece a esto:

cc -g -c xyz.c -o xyz.o

"cc" es el compilador de C. A veces se utilizan compiladores de C alternativos; uno muy común es
llamado "gcc". Un compilador común de C ++ es el compilador GNU, generalmente llamado "g ++". Virtualmente
todos los compiladores de C y C ++ en Unix tienen la misma sintaxis para el resto del comando (al menos
para operaciones básicas), por lo que la única diferencia sería la primera palabra.

Más adelante explicaremos qué hace la opción "-g".

La opción "-c" le dice al compilador de C que produzca un archivo ".o" como salida. (Si no lo haces
especificar "-c", luego realiza el segundo paso de compilación automáticamente).

La opción "-o xyz.o" le dice al compilador cuál es el nombre del archivo objeto. Usted puede
omita esto, siempre que el nombre del archivo de objeto sea el mismo que el nombre de la fuente
archivo excepto por la extensión ".o".

En su mayor parte, el orden de las opciones y los nombres de los archivos no importa. Uno
La excepción importante es que el archivo de salida debe seguir inmediatamente a "-o".

Enlace
El segundo paso de la construcción de un programa se llama enlace. No se puede ejecutar un archivo de objeto
directamente; es una forma intermedia que debe ser vinculado a otros componentes para
producir un programa. Otros componentes pueden incluir:

· Bibliotecas. A bibliotecas, en términos generales, es una colección de módulos de objeto que son
incluido según sea necesario. Por ejemplo, si su programa llama a la función "printf", entonces
la definición de la función "printf" debe incluirse desde la biblioteca del sistema C.
Algunas bibliotecas se vinculan automáticamente a su programa (por ejemplo, la que contiene
"printf") para que nunca tengas que preocuparte por ellos.

· Archivos de objeto derivados de otros archivos fuente en su programa. Si escribe su
programa para que en realidad tenga varios archivos fuente, normalmente compilaría cada
archivo de origen a un archivo de objeto separado y luego vincularlos todos juntos.

El izquierda es el programa responsable de tomar una colección de archivos de objetos y
bibliotecas y vincularlas para producir un archivo ejecutable. El archivo ejecutable es
el programa que realmente ejecuta.

El comando para vincular el programa se parece a esto:

cc -g xyz.o -o xyz

Puede parecer extraño, pero normalmente ejecutamos el mismo programa ("cc") para realizar el enlace. Qué
lo que sucede bajo la superficie es que el programa "cc" pasa inmediatamente el control a un
programa diferente (el vinculador, a veces llamado cargador, o "ld") después de agregar un número
de piezas complejas de información a la línea de comando. Por ejemplo, "cc" le dice a "ld" donde
la biblioteca del sistema es la que incluye la definición de funciones como "printf". Hasta ti
comience a escribir bibliotecas compartidas, por lo general no es necesario tratar directamente con "ld".

Si no especifica "-o xyz", el archivo de salida se llamará "a.out", que parece
para mí es una convención completamente inútil y confusa. Por lo tanto, siempre especifique "-o" en el
paso de enlace.

Si su programa tiene más de un archivo de objeto, debe especificar todos los archivos de objeto en
el comando de enlace.

¿Por qué Usted necesite a separado las pasos
¿Por qué no usar simplemente el comando simple de un paso, como este:

cc -g xyz.c -o xyz

en lugar de la compilación de dos etapas más complicada

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

si internamente el primero se convierte en el segundo? La diferencia es importante solo si
hay más de un módulo en su programa. Supongamos que tenemos un módulo adicional,
"abc.c". Ahora nuestra compilación se ve así:

# Mando de una etapa.
cc -g xyz.c abc.c -o xyz

or

# Mando de dos etapas.
cc -g -c xyz.c -o xyz.o
cc -g -c abc.c -o abc.o
cc -g xyz.o abc.o -o xyz

El primer método, por supuesto, se convierte internamente en el segundo método. Esto significa
que tanto "xyz.c" como "abc.c" se vuelven a compilar cada vez que se ejecuta el comando. Pero si tu
sólo cambió "xyz.c", no es necesario volver a compilar "abc.c", por lo que la segunda línea de los dos
No es necesario realizar los comandos de escenario. Esto puede marcar una gran diferencia en la compilación.
tiempo, especialmente si tiene muchos módulos. Por esta razón, prácticamente todos los archivos MAKE mantienen
los dos pasos de compilación se separan.

Eso es básicamente lo básico, pero hay algunos pequeños detalles más que realmente deberías
saber sobre.

Depuración vs optimización
Por lo general, los programadores compilan un programa ya sea para depurar o para acelerar. Compilacion
porque la velocidad se llama optimización; compilar con optimización puede hacer que su código se ejecute hasta
5 veces más rápido o más, dependiendo de su código, su procesador y su compilador.

Con ganancias tan dramáticas posibles, ¿por qué no querría optimizar? Lo mas
La respuesta importante es que la optimización hace que el uso de un depurador sea mucho más difícil.
(a veces imposible). (Si no sabe nada sobre un depurador, es hora de aprender.
La media hora o la hora que dedicará a aprender los conceptos básicos se le reembolsará muchas veces.
en el tiempo que guardará más tarde al depurar. Recomiendo comenzar con un depurador de GUI
como "kdbg", "ddd" o "gdb" se ejecutan desde emacs (consulte las páginas de información en gdb para
instrucciones sobre cómo hacer esto).) Optimización reordena y combina declaraciones, elimina
variables temporales innecesarias, y generalmente reorganiza su código para que sea muy
difícil de seguir dentro de un depurador. El procedimiento habitual es escribir su código, compilarlo
sin optimización, depúrelo y luego active la optimización.

Para que el depurador funcione, el compilador tiene que cooperar no solo no
optimizando, sino también poniendo información sobre los nombres de los símbolos en el objeto
file para que el depurador sepa cómo se llaman las cosas. Esto es lo que la compilación "-g"
la opción lo hace.

Si ha terminado de depurar y desea optimizar su código, simplemente reemplace "-g" con
"-O". Para muchos compiladores, puede especificar niveles crecientes de optimización agregando
un número después de "-O". También puede especificar otras opciones que aumenten la
velocidad en algunas circunstancias (posiblemente compensando con un mayor uso de memoria). Ver
la página de manual de su compilador para obtener más detalles. Por ejemplo, aquí hay un comando de compilación de optimización
que uso con frecuencia con el compilador "gcc":

gcc -O6 -malign-doble -c xyz.c -o xyz.o

Puede que tenga que experimentar con diferentes opciones de optimización para obtener lo mejor
rendimiento. Es posible que necesite diferentes opciones para diferentes piezas de código. Generalmente
hablando, un indicador de optimización simple como "-O6" funciona con muchos compiladores y, por lo general,
produce resultados bastante buenos.

Advertencia: en raras ocasiones, su programa no hace exactamente lo mismo cuando
está compilado con optimización. Esto puede deberse a (1) una suposición no válida que hizo
en su código que era inofensivo sin optimización, pero causa problemas porque el
el compilador se toma la libertad de reorganizar las cosas cuando optimiza; o (2) tristemente,
Los compiladores también tienen errores, incluidos errores en sus optimizadores. Para un compilador estable como
"gcc" en una plataforma común como un Pentium, los errores de optimización rara vez son un problema (a partir de
el año 2000 - hubo problemas hace unos años).

Si no especifica "-g" ni "-O" en su comando de compilación, el objeto resultante
El archivo no es adecuado para depurar ni para ejecutarse rápidamente. Por alguna razón, esta es la
defecto. Por lo tanto, siempre especifique "-g" o "-O".

En algunos sistemas, debe proporcionar "-g" tanto en la compilación como en los pasos de vinculación; en otros
(p. ej. Linux), solo debe proporcionarse en el paso de compilación. En algunos sistemas, "-O"
en realidad hace algo diferente en la fase de vinculación, mientras que en otras no tiene ningún efecto.
En cualquier caso, siempre es inofensivo proporcionar "-g" o "-O" para ambos comandos.

Advertencias
La mayoría de los compiladores son capaces de detectar una serie de errores de programación comunes (por ejemplo,
olvidar devolver un valor de una función que se supone que devuelve un valor). Generalmente,
querrá activar las advertencias. La forma de hacerlo depende de su compilador (consulte el manual
page), pero con el compilador "gcc", normalmente uso algo como esto:

gcc -g -Pared -c xyz.c -o xyz.o

(A veces también agrego "-Wno-uninitialized" después de "-Wall" debido a una advertencia que es
generalmente es incorrecto que surge al optimizar).

Estas advertencias me han ahorrado muchas horas de depuración.

Otro eficiente compilación opciones
A menudo, los archivos de inclusión necesarios se almacenan en algún directorio que no sea el actual.
directorio o el sistema incluye directorio (/ usr / include). Esto sucede con frecuencia cuando
está utilizando una biblioteca que viene con archivos de inclusión para definir las funciones o clases.

Suponga, por ejemplo, que está escribiendo una aplicación que usa las bibliotecas Qt. Tienes
instaló una copia local de la biblioteca Qt en / inicio / usuarios / joe / qt, Lo que significa que el
los archivos de inclusión se almacenan en el directorio / home / users / joe / qt / include. En su código, usted
quiero poder hacer cosas como esta:

#incluir

en lugar de

#include "/home/users/joe/qt/include/qwidget.h"

Puede decirle al compilador que busque archivos de inclusión en un directorio diferente usando el
Opción de compilación "-I":

g ++ -I / inicio / usuarios / joe / qt / include -g -c mywidget.cpp -o mywidget.o

Por lo general, no hay espacio entre "-I" y el nombre del directorio.

Cuando el compilador de C ++ está buscando el archivo qwidget.h, mirará en
/ home / users / joe / qt / include antes de buscar en el directorio de inclusión del sistema. Usted puede
especifique tantas opciones "-I" como desee.

Usar bibliotecas
A menudo, tendrá que decirle al vinculador que se vincule con bibliotecas externas específicas, si
están llamando a funciones que no forman parte de la biblioteca C estándar. La "-l" (minúscula
L) opción dice que se vincule con una biblioteca específica:

cc -g xyz.o -o xyz -lm

"-lm" dice que se vincula con la biblioteca matemática del sistema, que necesitará si está utilizando
funciona como "sqrt".

Ten cuidado: si especifica más de una opción "-l", el orden puede marcar la diferencia en algunos
sistemas. Si obtiene variables indefinidas cuando sabe que ha incluido el
biblioteca que los define, puede intentar mover esa biblioteca al final del comando
línea, o incluso incluirlo por segunda vez al final de la línea de comando.

A veces, las bibliotecas que necesitará no se almacenan en el lugar predeterminado para el sistema.
Bibliotecas. "-labc" busca un archivo llamado libabc.a or libabc.so or libabc.sa existentes
directorios de la biblioteca del sistema (/ Usr / lib y, por lo general, también en algunos otros lugares, dependiendo de lo que
tipo de Unix que estás ejecutando). La opción "-L" especifica un directorio adicional para buscar
para bibliotecas. Para volver a tomar el ejemplo anterior, suponga que ha instalado las bibliotecas Qt
in / inicio / usuarios / joe / qt, lo que significa que los archivos de la biblioteca están en / inicio / usuarios / joe / qt / lib.
Su paso de enlace para su programa podría verse así:

g ++ -g test_mywidget.o mywidget.o -o test_mywidget -L / home / users / joe / qt / lib -lqt

(En algunos sistemas, si enlaza en Qt, también deberá agregar otras bibliotecas (por ejemplo,
"-L / usr / X11R6 / lib -lX11 -lXext"). Lo que debe hacer dependerá de su sistema).

Tenga en cuenta que no hay espacio entre "-L" y el nombre del directorio. La opción "-L" generalmente
va antes de cualquier opción "-l" a la que se supone que afecta.

¿Cómo sabe qué bibliotecas necesita? En general, esta es una pregunta difícil y varía
dependiendo del tipo de Unix que esté ejecutando. La documentación de las funciones o
las clases que está utilizando deben decir con qué bibliotecas necesita vincularse. Si esta usando
funciones o clases de un paquete externo, generalmente hay una biblioteca que necesita vincular
con; la biblioteca generalmente será un archivo llamado "libabc.a" o "libabc.so" o "libabc.sa"
si necesita agregar una opción "-labc".

Cosas otros confuso cosas
Es posible que haya notado que es posible especificar opciones que normalmente se aplican a
compilación en el paso de vinculación, y las opciones que normalmente se aplican a la vinculación en el
paso de compilación. Por ejemplo, los siguientes comandos son válidos:

cc -g -L / usr / X11R6 / lib -c xyz.c -o xyz.o
cc -g -I / en algún lugar / incluir xyz.o -o xyz

Las opciones irrelevantes se ignoran; los comandos anteriores son exactamente equivalentes a esto:

cc -g -c xyz.c -o xyz.o
cc -g xyz.o -o xyz

Use makepp_tutorial_compilation en línea usando los servicios de onworks.net


Servidores y estaciones de trabajo gratuitos

Descargar aplicaciones de Windows y Linux

  • 1
    MSYS2
    MSYS2
    MSYS2 es una colección de herramientas y
    bibliotecas que le proporcionan una
    entorno fácil de usar para la construcción,
    instalar y ejecutar Windows nativo
    software. Con ...
    Descargar MSYS2
  • 2
    libjpeg-turbo
    libjpeg-turbo
    libjpeg-turbo es un códec de imagen JPEG
    que usa instrucciones SIMD (MMX, SSE2,
    NEON, AltiVec) para acelerar la línea de base
    Compresión y descompresión JPEG activadas
    x86, x8 ...
    Descargar libjpeg-turbo
  • 3
    Xtreme Download Manager
    Xtreme Download Manager
    El proyecto tiene ahora un nuevo hogar:
    https://xtremedownloadmanager.com/ For
    desarrolladores:
    https://github.com/subhra74/xdm Xtreme
    Download Manager es una poderosa herramienta pa...
    Descarga el administrador de descargas Xtreme
  • 4
    TTGO VGA32 Lite
    TTGO VGA32 Lite
    Características: 4:3 y 16:9 de baja resolución
    Salida VGATeclado y mouse PS/2
    interfaz de usuario basada en inputText (TUI)
    con administrador de diálogo Unicode parcial
    soporteDispositivo esclavo...
    Descargar TTGO VGA32 Lite
  • 5
    Cargador de arranque Clover EFI
    Cargador de arranque Clover EFI
    El proyecto se ha trasladado a
    https://github.com/CloverHackyColor/CloverBootloader..
    Características: Arranque macOS, Windows y Linux
    en UEFI o en modo heredado en Mac o PC con
    UE...
    Descarga el gestor de arranque Clover EFI
  • 6
    rpmsunidos
    rpmsunidos
    ¡Únase a nosotros en Gitter!
    https://gitter.im/unitedrpms-people/Lobby
    Habilite el repositorio URPMS en su
    sistema -
    https://github.com/UnitedRPMs/unitedrpms.github.io/bl...
    Descargar unitedrpms
  • Más "

Comandos de Linux

Ad