2016-05-04 25 views
-1

Ich habe zwei Quellen, die ich zu einer C statischen Bibliothek kombinieren möchte.Erstellen einer statischen Bibliothek in C

renderay_core.c 
renderay_shapes.c 

und die entsprechenden Header-Dateien. Ich habe dies zuerst als Standalone (Nicht-Bibliothek) kompiliert, um hier Fehler zu vermeiden.

test.c

#include <stdio.h> 
#include "renderay_core.c" 
#include "renderay_shapes.c" 

int main(void){ 
    Canvas* canvas = new_Canvas(5,5); 
    printf("Test"); 
} 

es mit kompiliert:

gcc test.c renderay_core.c renderay_shapes.c -o main.exe 

und es funktionierte gut.

Jetzt bin ich dran, dies in eine statische lib zu packen. Doing as befored:

gcc -c renderay_core.c renderay_shapes.c 

Jetzt habe ich die Objekte bereit, als eine Bibliothek verknüpft werden.

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

Ist der Befehl, den ich dafür verwende. Dann versuche ich, meine test.c mit der Bibliothek anstelle der einfachen Quelldateien zu kompilieren.

gcc test.c -o main.exe -static -L -lrenderay 

Jetzt, wenn ich versuche, dies zu kompilieren bekomme ich eine Fehlerwarnung:

undefined Verweis auf „new_Canvas“

mir zu sagen, dass die Verknüpfung mit der Bibliothek ist fehlgeschlagen. Was mache ich hier falsch? Was habe ich verpasst?

+0

Erfahren Sie mehr über Header-Dateien. Implementierungsdateien nicht einschließen. – Olaf

+0

Sie scheinen "ar" gegen die C-Quelldateien statt gegen die Objektdateien auszuführen. –

Antwort

2

Compile - ohne Anbindung - die Quelldateien

gcc -c renderay_core.c -o renderay_core.o 
gcc -c renderay_shapes.c -o renderay_shapes.o 

es dann

ar -rcs librenderay.a renderay_core.o renderay_shapes.o 

Und Link packen Sie es mit

gcc test.c -o main.exe -static -L. -lrenderay 

Sie müssen die L die Nicht-Standard-Speicherort angeben - aktuelles Verzeichnis hier.

+0

oh ich sehe a. nach dem -L Mybe, der das Problem verursacht hat ... – xetra11

+0

Ja, Sie brauchen einen Punkt ('.'), um den Linker auf das aktuelle Verzeichnis zu verweisen. – sjsam

+0

Dank wusste nicht, dass – xetra11

0

Das Problem ist, dass Sie Quelldateien verknüpfen, aber nicht Objektdateien

ar rcs librenderay.a renderay_core.c renderay_shapes.c 

Es muss etwas wie das

ar rcs librenderay.a renderay_core.o renderay_shapes.o 

P. S. sein Sie können dies mit Makefile

CFLAGS = -O2 -Wall -fPIC 
OBJS = renderay_core.o renderay_shapes.o 

.c.o: 
    $(CC) $(CFLAGS) -c $< 

librenderay.a: $(OBJS) 
    $(AR) rcs librenderay.a $(OBJS) 

.PHONY: clean 
clean: 
    $(RM) librenderay.a $(OBJS) 
+0

ahhhh ok meh, ein bisschen Tippfehler. Danke, Alter – xetra11

Verwandte Themen