2017-03-17 5 views
3

Ich versuche, eine gemeinsame Bibliothek namens unter -lrfc7539 mit der Struktur zu schaffen:gemeinsam genutzte C-Bibliothek Probleme

rfc7539.o: rfc7539.c chacha20poly1305.o 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

chacha20poly1305.o: chacha20poly1305.c chacha20.o poly1305.o 
    $(CC) $(CFLAGS) -c -o [email protected] $< 

chacha20.o: chacha_merged.c 
    $(CC) -fPIC $(CFLAGS) -c -o [email protected] $< 

poly1305.o: poly1305-donna.c 
    $(CC) -fPIC $(CFLAGS) -DPOLY1305_16BIT -c -o [email protected] $< 

rfc7539_test: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o 

.PHONY: clean 

clean: 
    @rm -f *.o 
    @rm -f rfc7539_test 

ich diesen Befehl dann tun gcc -shared -o lrfc7539.so *.o.so-Datei erstellen Gibt es eine bessere Praxis für meine Make-Datei zu in der Lage sein, dies automatisch zu tun?

Antwort

2

Sie müssen ein Ziel in Ihrem Makefile erstellen, das den gcc-Befehl ausführt, den Sie angegeben haben. Wenn diese Bibliothek der Hauptausgang ist, machen ein all Ziel zeigt auf in

all: lrfc7539.so 

lrfc7539.so: rfc7539.o chacha20poly1305.o chacha20.o poly1305.o 
    gcc -shared -o [email protected] *.o 
+0

Dank dieser die Antwort war ich für den ganzen Tag suchen. – yrekik

+0

@YoussefRekik Froh ich könnte helfen. Fühlen Sie sich frei, diese Antwort zu akzeptieren (http://stackoverflow.com/help/accepted-answer), wenn Sie es nützlich fanden. – dbush

2

Sie nur eine Regel mit diesem Ziel machen.

librfc7539.so: rfc7539.o chacha20poly1305.o poly1305.o chacha20.o 
    $(LINK.c) $(OUTPUT_OPTION) -shared $^ $(LOADLIBES) $(LDLIBS) 

ich den Befehl von make --print-data-base kopiert (Sie aktualisieren können Ihre anderen Befehle ebenfalls). Möglicherweise müssen Sie auch -fPIC zu LDFLAGS hinzufügen.

Ich rief Ihre Bibliothek librfc7539.so, so dass Sie mit -lrfc7539 verknüpfen können - ich denke, das ist, was Sie wollen.


Ich glaube, es am besten Praxis ist explizit die Objektdateien zu verknüpfen Sie beabsichtigen, zu spezifizieren, aber einige mögen davon ausgehen, dass jede Quelldatei kompiliert werden müssen und verknüpft:

sources := $(wildcard *.c) 
librfc7539.so: $(sources:.c=.o) 

Dies würde nicht funktionieren für Sie jedoch, es sei denn, Sie haben die Quelldateien umbenannt, die in Objektdateien mit unterschiedlichem Namen kompiliert werden.


Ich bemerke, dass es merkwürdig ist, dass Ihre Objektdateien von anderen Objektdateien abhängen. Das sollte nicht der Fall sein, obwohl sie Abhängigkeiten von einigen Header Dateien benötigen.

ist die komplette Makefile (vorausgesetzt, 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: 
Verwandte Themen