Frage

Ich habe zwei Dateien -> fact.h und main.c in der /home/snyp1/new Ordner. main.c hat die Hauptfunktion, die das aufruft fact(int x) funktion in fact.h.Ich erstelle eine .a archivieren mit dem ar-Befehl ->

snyp1@Snyp:~/new$ ar -r -s libfact.a fact.o
ar: creating libfact.a
fact.h  fact.o  libfact.a  main.c
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status
snyp1@Snyp:~/new$ ranlib libfact.a
snyp1@Snyp:~/new$ gcc main.c -L/home/snyp1/new -lfact -o main
/home/snyp1/new/libfact.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld returned 1 exit status

Ich bin auf Ubuntu 12.04.Bitte lassen Sie mich wissen, was los ist.(Auch wenn ich das nicht benutze -L/.../new, gcc wird sagen, dass es "lfact" nicht finden kann, vielleicht weil es nicht drin ist /usr/local/lib)

BEARBEITEN:OK, ich habe die Ursache gefunden.Es liegt an der Tatsache, dass ich benutzt habe fact.h um das zu bauen fact.o und als es dann in die Bibliothek gestellt wurde, funktionierte es nicht wie erwartet.Also habe ich es jetzt geändert in file.c und funktioniert jetzt gut.Ich hätte diese Information zur Verfügung stellen sollen, tut mir leid.Obwohl ich nicht weiß, warum diese Art von Problem auftreten sollte.Sind Bibliotheken ohne mindestens eine nicht möglich .c datei darin?

War es hilfreich?

Lösung

Ich habe Fakten benutzt.h, um die Tatsache aufzubauen.o und dann in die Bibliothek stellen, es funktionierte nicht wie erwartet.

Meinst du, du hast kompiliert fact.h produzieren fact.o?

Wenn ja, hat das nicht das getan, was Sie erwartet haben.Wenn du anrufst gcc in einer Header-Datei wird ein vorkompilierter Header erstellt, nicht Objektdateien.Also obwohl du eine Datei namens hast foo.o es war keine gültige Objektdatei.Wenn du nur gelaufen wärst gcc -c fact.h es hätte einen vorkompilierten Header erzeugt fact.gch, aber vermutlich bist du gelaufen gcc -c fact.h -o fact.o wodurch die Datei aufgerufen wird fact.o obwohl es immer noch ein vorkompilierter Header ist. file fact.o hätte gezeigt, dass:

$ file fact.o
fact.o: GCC precompiled header (version 013) for C

Sie hätten GCC zwingen können, die Datei als C-Code und nicht als Header zu behandeln, indem Sie Folgendes ausgeführt haben gcc -x c -c fact.h -o fact.o (der -x c sagt, die Eingabe als C-Code zu behandeln, anstatt den Typ aus der Dateierweiterung abzuleiten), aber es ist wahrscheinlich einfacher und weniger verwirrend, Ihre Datei einfach richtig zu benennen, anstatt zu versuchen, einen Header zu kompilieren.

Sind Bibliotheken ohne mindestens eine nicht möglich.c-Datei drin?

Sie benötigen mindestens eine Objektdatei (z. .o datei), aber Sie hatten kein gültiges Objekt, Sie hatten einen vorkompilierten Header mit dem irreführenden Namen .o, aber es war eigentlich keine Objektdatei.

wenn ich das nicht benutze -L/.../new, gcc wird sagen, dass es "lfact" nicht finden kann, vielleicht weil es nicht drin ist /usr/local/lib

Der Linker schaut nicht nur rein /usr/local/lib, es gibt andere Standardorte, an denen es aussieht, aber ja, das ist im Grunde das Problem.Beachten Sie, dass Sie auch sagen können -L. wenn sich die Bibliothek im aktuellen Verzeichnis befindet, ist dies einfacher als die Angabe eines absoluten Pfads.

Andere Tipps

Ich bin mir nicht sicher ar unterstützt einen Bindestrich für alles andere als die erste Option.Versuchen

ar -rs libfact.a fact.o

oder einfach nur

ar rs libfact.a fact.o

Wohlgemerkt, ich weiß nicht warum laufen ranlib hat aber nicht funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top