我正在尝试创建一个名为-lrfc7539
的共享库
结构如下:
rfc7539.o: rfc7539.c chacha20poly1305.o
$(CC) $(CFLAGS) -c -o $@ $<
chacha20poly1305.o: chacha20poly1305.c chacha20.o poly1305.o
$(CC) $(CFLAGS) -c -o $@ $<
chacha20.o: chacha_merged.c
$(CC) -fPIC $(CFLAGS) -c -o $@ $<
poly1305.o: poly1305-donna.c
$(CC) -fPIC $(CFLAGS) -DPOLY1305_16BIT -c -o $@ $<
rfc7539_test: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o
.PHONY: clean
clean:
@rm -f *.o
@rm -f rfc7539_test
然后我执行此命令gcc -shared -o lrfc7539.so *.o
来创建.so
文件
我的makefile是否有更好的做法可以自动执行此操作?
答案 0 :(得分:2)
您需要在makefile中创建一个运行您提供的gcc命令的目标。如果此库是主输出,请将all
目标指向。
all: lrfc7539.so
lrfc7539.so: rfc7539.o chacha20poly1305.o chacha20.o poly1305.o
gcc -shared -o $@ *.o
答案 1 :(得分:2)
您可以使用该目标制定规则:
librfc7539.so: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o
$(LINK.c) $(OUTPUT_OPTION) -shared $^ $(LOADLIBES) $(LDLIBS)
我从make --print-data-base
复制了命令(您可以同样更新其他命令)。您可能还需要将-fPIC
添加到LDFLAGS
。
我致电您的图书馆librfc7539.so
,以便您可以使用-lrfc7539
链接到它 - 我认为这就是您想要的。
我认为最佳做法是明确指定您要链接的目标文件,但有些人喜欢假设每个源文件都必须编译和链接:
sources := $(wildcard *.c)
librfc7539.so: $(sources:.c=.o)
除非您重命名编译为不同命名的目标文件的源文件,否则这对您不起作用。
我注意到你的目标文件依赖于其他目标文件很奇怪。情况应该不是这样,尽管它们可能需要依赖某些标头文件。
这是一个完整的Makefile(假设是GNU Make):
CFLAGS += -Wall -Wextra
CFLAGS += -fPIC
LDFLAGS += -fPIC
%.so: LDFLAGS += -shared
all: rfc7539_test librfc7539.so
librfc7539.so: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o
$(LINK.c) $(OUTPUT_OPTION) $^ $(LOADLIBES) $(LDLIBS)
rfc7539_test: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o
$(LINK.c) $(OUTPUT_OPTION) $^ $(LOADLIBES) $(LDLIBS)
# Default %.o:%.c rule works, except for these files with misnamed sources:
chacha20.o: chacha_merged.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
poly1305.o: poly1305-donna.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
# Specific flags for this source file
poly1305.o: CFLAGS += -DPOLY1305_16BIT
.PHONY: clean
clean:
@$(RM) *.o
@$(RM) rfc7539_test
.DELETE_ON_ERROR: