C プログラム Makefile ヘルプ

C プログラム Makefile ヘルプ

以前に作成した他のライブラリを含む新しいライブラリを作成しようとしています。

現在のフォルダでは、ソースファイルはsrcフォルダ内にあり、ヘッダはincludeフォルダ内にあります。

これまで私がしたことは次のとおりです。

NAME        := mainlibrary.a

SRCS        :=  $(wildcard src/*.c)
OBJS        := $(SRCS:.c=.o) $(wildcard lib/*.o)
S_LIB       := lib/secondarylibrary.a

CC          := gcc
CFLAGS      := -Wall -Wextra -Werror -Iinclude -Ilib
    
RM          := rm -f
MAKEFLAGS   := --no-print-directory
    
all: $(S_LIB) $(NAME)
    
$(NAME): $(OBJS) $(S_LIB)
    ar rcs $(NAME) $(OBJS) $(S_LIB)

$(S_LIB):
    $(MAKE) -C lib

%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    $(RM) $(OBJS) $(wildcard lib/*.o)

fclean: clean
    $(RM) $(NAME) $(S_LIB)

re:
    $(MAKE) fclean
    $(MAKE) all

.PHONY: all bonus clean fclean re

今私のプログラムを次のようにコンパイルしようとすると

gcc main.c -L. -lmainlibrary.a -Iinclude -Ilib.

補助ライブラリーを指定しないと、これはできません。これは、そのライブラリを既に自分のメインライブラリに配置しようとしているため、目的全体を破棄します。

助けてくれてありがとう。

答え1

本当にありがとうございます。私はこれら2つのライブラリを一緒にマージできると思う間違いを犯しました。私がしたことは、サブディレクトリに生成されたオブジェクトファイルをインポートし、現在のオブジェクトファイルと一緒に使用して2番目のライブラリを作成することでした。今はあまりにも明らかだと思います...

編集:要求に応じて私がしたことを説明します。 secondlibrary.aは利用できず、デフォルトのライブラリ.aとマージできません。

これで、セカンダリライブラリ.aを作成する前に、そのフォルダ内のすべての.cファイルからすべてのオブジェクトファイルを生成するlibフォルダにmakefileがあります。

私のメイクファイルの次の行は次のとおりです。 $(S_LIB): $(MAKE) -C lib

デフォルトではlibフォルダに移動し、「make」コマンドを使用してmakefileを有効にします。

そのフォルダにすでにすべてのオブジェクトファイルを作成しているので、必要なのは、このファイルをmainlibrary.aで使用したファイルと一緒に使用することだけです。

以前に公開したmakefileを変更しました。

NAME        := libftprintf.a
SUBDIR      := libft
SRCDIR      := src
INCDIR      := include

SRCS        := $(wildcard $(SRCDIR)/*.c)
OBJS        := $(SRCS:$(SRCDIR)/%.c=%.o)
INCLUDES    := -I$(INCDIR) -Ilibft

CC          := clang
CFLAGS      := -Wall -Wextra -Werror $(INCLUDES)

RM          := rm -f
MAKEFLAGS   := --no-print-directory

all: $(NAME)

$(NAME): $(OBJS) $(SUBDIR)/libft.a
    ar rcs $(NAME) $(OBJS) $(wildcard $(SUBDIR)/*.o)

$(SUBDIR)/libft.a:
    $(MAKE) -C $(SUBDIR)

%.o: $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

clean:
    $(RM) $(OBJS)
    $(MAKE) -C $(SUBDIR) clean

fclean:
    $(RM) $(NAME) $(OBJS)
    $(MAKE) -C $(SUBDIR) fclean

re:
    $(MAKE) fclean
    $(MAKE) all

.PHONY: all clean fclean re $(SUBDIR)/libft.a

私のmainlibrary.aの$(NAME)は、現在のディレクトリのオブジェクトファイルと私のサブディレクトリのオブジェクトファイルに依存します。 「$(SUBDIR)/libft.a」(mysecondarylibrary.a) は実際に作成する必要はありませんが、課題に必要な要件なので、そのままにしていたので活用も可能でした。このサブディレクトリにすでに存在するmakefileの内容。

関連情報