Tengo un archivo de encabezado myheader.h y una biblioteca estática libmylib.un archivo en directory1. En directory2, estoy escribiendo un programa que los utiliza. Supongamos que tengo principal.c en directory2 que utiliza myheader.h y libmylib.una. ¿Cómo puedo crear un archivo Makefile para compilar y vincular ellos?

Ahora mismo, en mi main.c, he añadido

#include "../directory1/myheader.h"

Aquí está mi Makefile en el momento:

CC = gcc

INCLUDES = -I

CFLAGS = -g -Wall $(INCLUDES)

main: main.o ../directory1/libmylib.a
    $(CC) main.o ../directory1/libmylib.a -o main

main.o: main.c ../directory1/myheader.h
    $(CC) $(CFLAGS) -c main.c

Me da el siguiente aviso:

gcc -g -Wall -I -c main.c
/home/me/directory2/main.c:72: undefined reference to `foo'
collect2: ld returned 1 exit status
make: *** [main.o] Error 1

donde foo es una de las funciones en la biblioteca.

  • No creo que el -L está ayudando.
  • No parece ser un problema con el enlace.
InformationsquelleAutor ask | 2013-02-23

2 Comentarios

  1. 4

    Aceptar. Se corrigió.

    He quitado #include "../directory1/myheader.h" y lo reemplazó con #include "myheader.h".

    A continuación, en el archivo Makefile, he utilizado:

    CC = gcc
    
    INCLUDES = -I../directory1
    
    CFLAGS = -g -Wall $(INCLUDES)
    
    LDFLAGS = -L../directory1
    
    main: main.o ../directory1/libmylib.a
        $(CC) main.o $(LDFLAGS) -lmylib -o main
    
    main.o: main.c ../directory1/myheader.h
        $(CC) $(CFLAGS) -c main.c
  2. 2

    Utilizando -lmylib será un problema. Para los no-bibliotecas estáticas usted necesita jugar con la variable LD_LIBRARY_PATH; ver ¿Por qué tengo que definir LD_LIBRARY_PATH con una exportación cada vez que ejecuto mi aplicación?. Se podría arreglar el archivo makefile mediante la adición de -L ../directory1. Pero la cosa más simple es simplemente reemplazar -lmylib con ../directory1/libmylib.a.

    Por ejemplo:

    directory1/mylib.c

    #include "../directory1/myheader.h"
    void foo(void) {}

    directory1/Makefile

    libmylib.a: mylib.o
        ar r [email protected] $?

    directory1/main.c:

    #include "../directory1/myheader.h"
    int main(void) {
       foo();
       return 0;
    }

    directory1/Makefile

    main: main.o ../directory1/libmylib.a
       gcc main.o ../directory1/libmylib.a -o main
    • De hacer los cambios. Agrega las advertencias estoy llegando a la pregunta. Algún consejo?

Dejar respuesta

Please enter your comment!
Please enter your name here