include 관련 질문입니다.

하하의 이미지

링크 에러입니다.

무엇이 문제인가요?

1.h

#ifndef HA
#define HA

int a();


#endif

2.h

#ifndef HB
#define HB

int b();


#endif

main.c

#include "1.h"
#include "2.h"

main()
{
        a();
        b();
}

int a(){
        printf(" a 다 ");
}

2.c

#include "2.h"

int b()
{
        printf(" b다");
}

Makefile

CC = gcc
AR = ar
GWLIB = 1lib.a

PROGRAM = test


OBJS = 2.o


.c.o:
        $(CC) -c $<


all: $(PROGRAM)


$(GWLIB): $(OBJS)
        @$(AR) -r $(GWLIB) $?


$(PROGRAM): $(GWLIB) main.o
        $(CC) $(GWLIB) -o $(PROGRAM) main.o 



clean:
        /bin/rm -f *.o $(GWLIB) $(PROGRAM)

make 하면

main.o: In function `main':
main.o(.text+0xc): undefined reference to `b'
collect2: ld returned 1 exit status
make: *** [test] 오류 1

- - ;;

이런것도 몰라 라고 하실거 같은데..

정말로 모르겠습니다. - - ;;

main.c 를 보면 a와 b함수를 사용하는데.

a는 main.c 안에서 정의 하였고 1.h에서 선언

b는 2.c 안에서 정의 하였고 2.h에서 선언.

main.c 는 include "a.h" , include "b.h"

이렇게 하면 되지 않는데?/

무엇가 중대한 착각을 하고 있는거 같습니다.

그럼 즐거운 하루 되세요... ^______^;;;;;;;

monpetit의 이미지

gcc 의 라이브러리는 접두사 + 이름 + 확장자 의 규칙이 있습니다.
라이브러리의 이름이 abc 라고 한다면 그 파일 이름은 libabc.a 입니다.
lib + 이름 + .a의 구성이죠.
그러므로 1lib.a 같은 이름은 gcc가 사용하기에 적당하지 않습니다.(물론 안 되는 건 아니지만...)
그리고 이 abc 라는 라이브러리, 즉 libabc.a 를 사용하여 링크할 때에는 이름 부분만 따로 분리해서 사용합니다.
$(CC) -o $(PROGRAM) main.o -labc -L.
사용법은 "-l라이브러리명(abc)"입니다. 맨 뒤에 붙은 "-L디렉토리"는 라이브러리가 존재하는 디렉토리입니다. /usr/lib, /usr/local/lib 등이 아닌 경우엔 명시적으로 적어주어야 합니다.
자세한 것은 info gcc 하세요.