Incluir una biblioteca externa en C

12 minutos de lectura

Incluir una biblioteca externa en C
dicción irónica

Estoy intentando usar una biblioteca C para un curso de software abierto de Harvard. Las instrucciones del instructor para configurar la biblioteca externa se pueden encontrar aquí.

Estoy siguiendo las instrucciones específicas de ubuntu mientras trato de usar esta biblioteca en mi caja de ubuntu. Seguí las instrucciones en la página para configurarlo, pero cuando ejecuto un simple helloWorld.c programa que usa una función de biblioteca cs50, gcc no quiere seguirle el juego.

Ejemplo:

holaMundo.c

#include <stdio.h>
#include <cs50.h>

int
main(void){
        printf("What do you want to say to the world?\n");
        string message = GetString();
        printf("%s!\n\n", message);
}

$ gcc helloWorld.c

/tmp/ccYilBgA.o: In function `main':
helloWorld.c:(.text+0x16): undefined reference to `GetString'
collect2: ld returned 1 exit status

Seguí las instrucciones al pie de la letra como se indica en las instrucciones, pero no me funcionaron. Estoy ejecutando ubuntu 12.04. Por favor, hágamelo saber si puedo aclarar más mi problema.

  • La inclusión del archivo de encabezado solo marca el prototipo de la función. Por lo tanto, su archivo compila bien pero hay un error de enlace. ¿Ha instalado las bibliotecas como se sugiere? Si es así, ¿podría verificar si las bibliotecas están instaladas correctamente y la variable de ruta está configurada correctamente para que gcc pueda encontrar estas bibliotecas usando la ruta?

    –Chethan Ravindranath

    28 de julio de 2012 a las 5:18

  • Lo hace gcc helloWorld.c -lcs50 ¿trabajo?

    – Alok Singhal

    28 de julio de 2012 a las 5:20

  • sí, no me di cuenta de que tenía que vincular explícitamente a lib en la línea cmd. Gracias a todos.

    – dicción irónica

    28 de julio de 2012 a las 5:28

  • ¿De qué otra manera va a saber que desea vincularse con esa biblioteca?

    –Jim Balter

    28 de julio de 2012 a las 6:10

  • yo estaba pensando #include <cs50.h> funcionaría como #include <stdio.h> .

    – dicción irónica

    28 de julio de 2012 a las 20:07


1647555434 994 Incluir una biblioteca externa en C
Basile Starynkevitch

Primero, como principiante, siempre debe pedirle a GCC que compile con todas las advertencias y la información de depuración habilitadas, es decir gcc -Wall -g. Pero en algún momento lee como invocar gcc. Usa un buen editor de código fuente (tal como Emacs de GNU o empuje o geditetc…) para editar su código fuente C, pero poder compilar su programa en la línea de comando (así que no siempre use un sofisticado IDE ocultación importante detalles de compilación de usted).

Entonces probablemente te estés perdiendo alguna biblioteca específica de Harvard, algunas opciones como -L seguido de un directorio de la biblioteca, luego -l pegado al nombre de la biblioteca. Entonces podrías necesitar gcc -Wall -g -lcs50 (reemplazar cs50 por el nombre apropiado) y es posible que necesite algunos -Lalgún-dir

Observe que el orden de los argumentos del programa para gcc es significante. Como regla general, si a depende de b deberías poner a antes de b; más específicamente sugiero

  1. Comience con el gcc nombre del programa; añade el C nivel estándar por ejemplo -std=c99 si quisiera
  2. Ponga la advertencia del compilador, las opciones de depuración (u optimización), por ejemplo -Wall -g (es posible que incluso desee agregar -Wextra para recibir aún más advertencias).
  3. Coloque las definiciones del preprocesador e incluya el directorio, por ejemplo -DONE=1 y -Imy-include-dir/
  4. Ponga su C archivo fuente hello.c
  5. Ponga cualquier archivo de objeto con el que esté enlazando, es decir bar.o
  6. Poner los directorios de la biblioteca -Lmy-lib-dir/ si es relevante
  7. Pur los nombres de la biblioteca -laa y -lbb (cuando el libaa.so depende de libbb.soen ese orden)
  8. Terminar con -o your-program-name para dar el nombre del binario producido. No use el nombre predeterminado a.out

Directorio dando opciones -I (para preprocesador incluye) y -L para las bibliotecas se puede dar varias veces, el orden es importante (orden de búsqueda).

Muy pronto querrás usar construir automatización herramientas como ÑU make (quizás con el ayuda de remake en Linux)

Aprende también a usar el depurador gdb.

Adquiera el hábito de pedir siempre advertencias al compilador, y siempre mejore su programa hasta que no reciba ninguna advertencia: ¡el compilador es su amigo, lo está ayudando!

Leer también Cómo depurar programas pequeños y los famosos SICP (que enseña conceptos muy importantes; es posible que desee utilizar guile en linux mientras lo lees, mira http://norvig.com/21-days.html para más). Tenga en cuenta también herramientas como Valgrind

Divertirse.

Tomo este curso y, a veces, necesito practicar fuera de línea mientras viajo o viajo. En Windows usando MinGW y Notepad ++ como IDE (porque me encanta y lo uso generalmente mientras codifico Python) finalmente encontré una solución y algo de tiempo para escribirla.

Comenzando desde cero. Pasos para configurar el compilador gcc C, si ya está configurado, salte al 5

  1. Descargar Git e instalar Incluye Git Bash, que es el terminal Linux MINGW64. Prefiero usar Git porque necesito herramientas de Linux como sed, awk, pull, push en mi Windows y puedo reemplazar la terminal de Guthub.
  2. Una vez instalado Git, asegúrese de que los paquetes gcc estén instalados. Puedes usar mi configuración como referencia…Administrador de instalación de MinGW - gcc
  3. Asegúrate de que tu compilador funcione. Tíralo con este código simple,

    • guardándolo en su directorio de trabajo Documentos/Harvard_CS50/Semana2/
      Hola C
    #include <stdio.h>
    
    int main(void)
    {
     printf("Hello StackOverflow\n");
    }
    
    • comienzo Git Bash -> navegar al directorio de trabajo

    cd Documentos/Harvard_CS50/Week2/

    • compilarlo en bash terminal

    gcc holamundo.c -o holamundo.exe

    • ejecutarlo usando bash terminal

    ./holamundo.exe

    Hola StackOverflow

    1. Si tú ves Hola StackOverflowsu compilador funciona y puede escribir código C.

Ahora, a lo importante, instalar la biblioteca CS50 localmente y usarla sin conexión. Esto debería ser aplicable para cualquier otra biblioteca que se presente más adelante en el curso.

  1. Descargue el último archivo de código fuente cs50.c y el archivo de encabezado cs50.h de https://github.com/cs50/libcs50/tree/develop/src y guardarlos en Documentos/Harvard_CS50/src

  2. Navegue al directorio src y enumere los archivos para asegurarse de que está en la ubicación correcta usando

    ls

    cs50.c cs50.h

  3. Genial, estamos aquí. Ahora necesitamos compilar el archivo de objeto para la biblioteca usando

    gcc -c -ggdb -std=c99 cs50.c -o cs50.o

  4. Ahora, utilizando el archivo de objeto cs50.o generado, podemos crear nuestro archivo de almacenamiento de la biblioteca cs50.

    ar rcs libcs50.a cs50.o

  5. Después de todos estos pasos, terminamos con 2 archivos adicionales a nuestros archivos originales. Nos interesan solo 2 de ellos cs50.h libcs50.a

    ls

    cs50.c cs50.h cs50.o libcs50.a

  6. Copie la biblioteca y los archivos de encabezado en sus ubicaciones de destino. Mi MinGW está instalado en C:\ así que los copio allí

    cs50.h –> C:\MinGW\incluye

    libcs50.a –> C:\MinGW\lib

Prueba de la biblioteca cs50

Para asegurarnos de que nuestra biblioteca funcione, podemos lanzar uno de los scripts de ejemplo en la lección y ver si podemos compilarlo usando el archivo de encabezado cs50.h para el método get_string().

#include <stdio.h>
#include <cs50.h>

int main(void) 
{
    printf("Please input a string to count how long it is: ");
    string s = get_string();
    int n = 0;
    while (s[n] != '\0')
        {
            n++;
        }
    printf("Your string is %i chars long\n", n); 
}
  1. Compile el código cs50 usando la biblioteca gcc y cs50. Quiero ser explícito y usar:

    gcc -ggdb -std=c99 -Wall -Werror prueba.c -lcs50 -o prueba.exe

    Pero simplemente puede señalar la fuente, el nombre del archivo de salida y la biblioteca cs50

    gcc prueba.c -o prueba.exe -lcs50

Aquí vamos, el programa se compila usando el encabezado y los métodos se pueden usar dentro.

Si desea Notepad ++ como IDE, puede seguir este consejo para configurarlo con gcc como compilador y ejecutar su código desde allí. Solo asegúrese de que su script nppexec incluya la biblioteca cs50

npp_save
gcc -ggdb -std=c99 -Wall -Werror "$(FULL_CURRENT_PATH)" -lcs50 -o "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"
cmd /c "$(CURRENT_DIRECTORY)\$(NAME_PART).exe"

Ejecute el código CS50 en Notepad ++

  • ¡La respuesta perfecta para los usuarios de Windows! Gracias por la explicación detallada con imágenes. Me gustaría agregar que para el paso 10, la ubicación de la carpeta que está buscando debe contener el stdio.h expediente. Para mí, fue: C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\x86_64-w64-mingw32 que contenía el include y lib carpetas que necesitaba. También, gracias a faizan-rizvi, quien proporcionó una pista adicional en su respuesta (opción 2, paso 2).

    – datalifenyc

    6 sep 2020 a las 11:27


Debe vincular contra la biblioteca durante la compilación. La biblioteca debe terminar en .a o .so si está en Ubuntu. Para enlazar contra una biblioteca:

gcc -o myProgram myProgram.c -l(library name goes here but no parentheses)

Tienes que enlazar contra la biblioteca, ¿cómo es que GCC sabría qué biblioteca quieres usar?

gcc helloWorld.c -lcs50

1647555435 284 Incluir una biblioteca externa en C
Faizán Rizvi

  1. Descarga el cs50 desde: http://mirror.cs50.net/library50/c/library50-c-5.zip
  2. Extraelo. (Obtendrá dos archivos cs50.c y cs50.h)
  3. Ahora copie ambos archivos en su carpeta de biblioteca predeterminada. (que incluye su archivo stdio.h)
  4. Ahora, mientras escribe su programa, use: #include
  5. También puede copiar los archivos a la carpeta que contiene su archivo helloWorld.c.
  6. Tienes que usar: #include “cs50.c”.

O ================================================= ====================>

  1. Abra los archivos cs50.c y cs50.h en el editor de texto.
  2. En cs50.h, justo debajo de #include < stdlib.h > agregue #include < stdio.h > y #include < string.h > ambos en la nueva línea.
  3. Ahora abra el archivo cs50.c, copie todo (desde: /**Lee una línea de texto de la entrada estándar y devuelve el equivalente {desde la línea 47 hasta la última}) y péguelo en cs50.h justo encima de #endif y guarde el archivos
  4. Ahora puede copiar el archivo cs50.h en su carpeta de biblioteca predeterminada o en su carpeta de trabajo actual.
  5. Si copió el archivo a la carpeta predeterminada, use: #include < cs50.h > y si copió los archivos a la carpeta de trabajo actual, use: #include ” cs50.h “.

Si necesita ayuda, puede preguntarme en faizan4427@gmail.com y si esto funcionó, vote.

¡¡¡Todo lo mejor!!!

Fuentes de investigación:

  • basándose en las respuestas anteriores dadas por Basile Starynkevitch y Gunay Anach
  • combinado con instrucciones de algunos videos en youtube 1 2

Acercarse:

  • cubrir las cosas mínimas que hacer y compartir las “normas” por separado
  • evitando cualquier modificación en cualquier otro lugar del sistema
  • incluyendo el desglose básico de los comandos utilizados
  • sin incluir todos los detalles finos, cubriendo solo los requisitos absolutos para la tarea o para la comunicación efectiva de instrucciones. dejando los otros detalles mundanos al lector
  • asumiendo que las otras cosas como el compilador, la variable de entorno, etc. ya están configuradas, y la familiaridad con los comandos de navegación de archivos de Shell está ahí

Mi entorno:

  • compilador: gcc a través de msys2
  • cascarón: bash a través de msys2
  • IDE: no importa aquí

Plan:

  1. obtener los archivos fuente
  2. construyendo los archivos requeridos: *.o (objeto) y *.a (archivo)
  3. decirle al compilador que lo use

Acción:

  1. Digamos, directorio actual = “desktop/cs50”
    Contiene todos los *.c archivos como test-file.c que crearé para tareas/conjuntos de problemas/práctica, etc.

  2. Consigue el *.h y *.c archivos
    Fuente en este caso particular: https://github.com/cs50/libcs50/tree/main/src

    1. Revisa cada archivo individualmente
    2. Copia todo el contenido del mismo.
      decir usando Icono “Copiar contenido sin procesar” de archivos individuales
    3. Cree el archivo correspondiente localmente en la computadora
      Hágalo en una carpeta separada solo para mantener las cosas limpias, digamos en “desktop/cs50/src” también conocido como ./src
  3. Cree los archivos necesarios en la terminal después de cambiar su directorio actual a “desktop/cs50/src”:

    1. gcc -c cs50.c para crear el archivo de objeto “cs50.o” desde “cs50.c” usando “gcc”
    2. ar cr libcs50.a cs50.o para crear el archivo de almacenamiento “libcs50.a” que contendrá el archivo de objeto “cs50.o”
    • Aquí, “libcs50” = prefijo “lib” + nombre “cs50” (igual que el nombre del archivo de encabezado)
    • Esta es la forma normal/estándar en la que el prefijo “lib” también es significativo para un paso posterior
    • Sin embargo, el prefijo se puede omitir y tampoco es obligatorio que el nombre coincida con el nombre del archivo de encabezado. Sin embargo, no se recomienda omitir el prefijo. Y no puedo decir con certeza sobre la parte del nombre
  4. Para decirle al compilador que pueda usar esta infraestructura, los comandos estarán en la siguiente sintaxis después de ir al directorio principal (es decir, a “desktop/cs50”):

    • gcc test-file.c -Isrc -Lsrc -lcs50 si usó el prefijo “lib” en el paso 2.2 anterior
    • aquí, -I bandera es para especificar el directorio de *.h archivo de encabezado incluido en su test_file.c
    • y -L bandera es para especificar el directorio que se utilizará para -l
    • y -l es por el nombre del *.a expediente. Aquí el prefijo “lib” del que se habló anteriormente, y la extensión “.a” no se menciona
    • el orden de estas banderas importa, mantenga el -I -L -l banderas después de “test-file.c”

Algunas notas más:

  • no olvide usar las banderas comunes adicionales (como las sugeridas arriba para errores, etc.)
  • si omitió el prefijo “lib”, entonces no puede usar -L -l banderas
    entonces, la sintaxis para el comando se convertirá en: gcc test-file.c -Isrc src/libcs50.a
  • decir que creé mi test-file.c archivo en “desktop/cs50/psets”, por lo tanto, se puede manejar de 2 maneras notables (dirección actual = “desktop/cs50/”):
    • cd psets luego cambiando la dirección relativa correspondientemente en -I -Lentonces resultado:
      gcc test-file.c -I../src -L../src -lcs50
    • manteniendo el directorio actual igual, pero luego cambiando la dirección relativa del archivo correspondientemente, por lo que resulta:
      gcc psests/test-file.c -Isrc -Lsrc -lcs50
    • o usa direcciones absolutas 😜
  • como se puede ver que esto se hace bastante largo, ahí es cuando se construyen herramientas de automatización como make patear (aunque lo estoy logrando usando un script de shell 😜)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad