C共享库问题

时间:2017-03-17 13:55:55

标签: c makefile

我正在尝试创建一个名为-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是否有更好的做法可以自动执行此操作?

2 个答案:

答案 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: