繁体   English   中英

C共享库问题

[英]C shared library problems

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

您需要在makefile中创建一个运行您提供的gcc命令的目标。 如果此库是主输出,请将all目标指向。

all: lrfc7539.so

lrfc7539.so: rfc7539.o chacha20poly1305.o chacha20.o poly1305.o 
    gcc -shared -o $@ *.o

您可以使用该目标制定规则:

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:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM