2016-12-23 2 views
0

Makefile에 동적 및 정적 라이브러리를 만드는 방법. 나는 C 코드를 가지고있다. inc 폴더에는 헤더 파일이 모두 포함되어 있으며이 폴더 외부에는 C 파일이 포함되어 있습니다. .a 및 .so 라이브러리를 만들고 싶습니다. 모든 파일이 실행될 것임을 나타내는 와일드 카드를 어떻게 포함합니까? 나는이 방법을 시도했다. (- 나는 보통 ruv를 사용 arru 또는 그 부근)Makefile에 정적 및 동적 라이브러리를 만드는 방법은 무엇입니까?

CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

lib: lib$(NAME).so 

lib$(NAME).so.$(VERSION): $(NAME).o 
    $(CC) -shared -Wl,-soname,lib$(NAME).so.$(MAJOR) $^ -o $(wildcard %.c) 

clean: 
    $(RM) *.o *.so* 
+0

게시 된 메이크 파일은 .so 라이브러리 만 생성합니다. 'all : lib $ (NAME) .so. $ (VERSION) lib $ (NAME) .a. $ (VERSION)'와 비슷한 첫 번째 대상을 추가해야합니다. 그런 다음 추가 레서피를 작성하여 정적 라이브러리 (lib $ (NAME) .a. $ (VERSION) – user3629249

답변

2
CFLAGS := -fPIC -O3 -g -Wall -Werror 
CC := gcc 
MAJOR := 0 
MINOR := 1 
NAME := foo 
VERSION := $(MAJOR).$(MINOR) 

LIBSO = lib$(NAME).so 
LIBSOM = $(LIBSO).$(MAJOR) 
LIBSOV = $(LIBSO).$(VERSION) 
LIBA = lib$(NAME).a 

lib: $(LIBSO) $(LIBA) 

$(LIBSO): $(LIBSOV) 
    ln -s $(LIBSOV) $(LIBSO) 

$(LIBSOV): $(NAME).o 
    $(CC) $(CFLAGS) -shared -Wl,-soname,$(LIBSOM) -o $(LIBSOV) $(NAME).o 

$(LIBA): $(NAME).o 
    $(AR) $(ARFLAGS) $(LIBA) $(NAME).o 

clean: 
    $(RM) *.o *.so* 

확인 매크로 ARARFLAGS이 적절하게 설정되어 있는지 확인합니다.

하나의 오브젝트 파일이 foo.o 인 이유가 확실하지 않거나 실제로 오브젝트 파일로 컴파일되고 라이브러리에 포함 된 디렉토리의 모든 C 소스 파일을 필요로하는지 여부는 명확하지 않습니다. 공유 오브젝트에 대한 연결 명령은 다음과 같습니다. 형식이 올바르지 않습니다. 첫 번째 .c 파일을 작성한 공유 객체로 덮어 씁니다.

SOURCE := $(wildcard *.c) 
OBJECT := $(SOURCE:.c=.o) 

및 규칙에 $(NAME).o 대신에 $(OBJECT)를 사용

당신이 도서관에 더 많은 오브젝트 파일을 원한다면, 정의합니다. 개인적으로, 나는 와일드 카드를 믿지 않는다 - 내 안락함을 위해 도서관에 시험 프로그램 코드 등이 너무 많이 포함될 위험이있다. YMMV.

+0

감사합니다. :) – Dulguuntur

관련 문제