2009-03-12 13 views
1

ich eine einfache lib machte in meiner Apps verwendet mir die Mühe zu definieren einige Funktionen immer und immer wieder zu retten ...Problem eine statische Lib in Linux Erstellen

Hier ist meine Make-Datei:

CC=gcc 
CFLAGS=-Wall -g -Wextra 
OBJS=getline.o debug.o 
LIB=libjimi.a 
.PHONY: clean purge 

libjimi.so : $(OBJS) 
     ar rcs $(LIB) $(OBJS) 
     @echo done! 
%.o : %.c 
     $(CC) $(CFLAGS) -c $^ 

clean : 
     @rm *.o 

purge : clean 
     @rm $(LIB) 

Jetzt bekomme ich einen segfault, wenn ich die Bibliothek verlinke, aber wenn ich die Objektdateien verlinke, die ich verbinde, um die Bibliothek zu erstellen, funktioniert es ... Rat?

+0

Meinst du, du bekommst den seg-Fehler bei Link-Zeit oder wenn Sie die verknüpfte ausführbare Datei ausführen? –

Antwort

2

Ihr Ziel sagen libjimi.so, die die Erweiterung für eine gemeinsame Bibliothek ist, sollte es nur libjimi.a für eine statische lib sein.

Und beachten Sie, dass wenn Sie eine statische lib verwenden, Sie es einfach wie jede andere Objektdatei verknüpfen, aber mit einer gemeinsamen lib verwenden Sie die -l-Syntax.

+0

aha danke, es funktioniert –

+0

Natürlich können Sie mit -ljimi verknüpfen, ob es statisch oder dynamisch ist (für libjimi.a oder libjimi.so). Die Bibliothek muss nur in einem der gesuchten Verzeichnisse sein (-L/einige/wo/lib um Verzeichnisse hinzuzufügen; -L ist selten notwendig). –

+0

Ich denke, Sie haben Recht, aber ich erinnere mich, dass mein Problem darin bestand, dass sowohl libsomething.a als auch libsomething.so auf meinem System existierten und wenn ich die .a Version wollte, wählte der -l Switch immer die .so Version .eine Version. – Zitrax

1

Statische Bibliotheken unter Linux (Unix) enden normalerweise mit ''; Gemeinsame Objekte enden mit '.so'. Ihre Bibliothek Regel ist zur Zeit:

libjimi.so : $(OBJS) 
    ar rcs $(LIB) $(OBJS) 
    @echo done! 

Es sollte:

$(LIB): $(OBJS) 
    ar rcs $(LIB) $(OBJS) 
    @echo done! 

Persönlich neige ich dazu,

AR  = ar 
ARFLAGS = rv 

verwenden Leitung:

$(LIB): $(OBJS) 
    $(AR) $(ARFLAGS) $(LIB) $(OBJS) 

nun alle Aspekte Der Build kann durch Setzen von Makros eingestellt werden - Falls benötigt.

Ohne zu wissen, wo der Absturz auftritt, ist es schwer zu wissen, was es verursachen könnte. Eine Möglichkeit besteht darin, dass Sie aufgrund der Makefile-Verwirrung eine Verknüpfung mit einer alten Version der Bibliothek und nicht mit der aktuellen Arbeitsversion herstellen.

Übrigens ist es nicht schön zu verbergen, was ein clean oder purge Ziel tut; es ist viel besser, lassen Sie make die Befehle (no @ vor) echo. Die @ ist völlig passend für die echo obwohl; sein Fehlen würde dazu führen, dass die gleiche Information zweimal präsentiert wird.

Verwandte Themen