以前に作成した他のライブラリを含む新しいライブラリを作成しようとしています。
現在のフォルダでは、ソースファイルは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の内容。