Domanda

Ho due file -> fact.h e main.c nella cartella /home/snyp1/new.main.c ha la funzione principale che chiama la funzione fact(int x) in fact.h.Sto creando un archivio .a con il comando AR ->

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
.

Sono su Ubuntu 12.04.Per favore fatemi sapere cosa c'è di sbagliato.(Inoltre, se non uso il -L/.../new, GCC dirà che non riesce a trovare "lfact", forse è perché non è in /usr/local/lib)

Modifica: OK Ho trovato la causa.È dovuto al fatto che stavo usando fact.h per costruire il fact.o e quindi metterlo in biblioteca, non funzionava come previsto.Quindi ora l'ho cambiato in file.c e sta funzionando bene ora.Avrei dovuto fornire tali informazioni, mi dispiace.Anche se non so perché questo tipo di problema dovrebbe sorgere.Non sono possibili librerie per apportare senza almeno un file .c in esso?

È stato utile?

Soluzione

.

Stavo usando Fact.h per costruire il fatto.o e poi metterlo in biblioteca, non funzionava come previsto.

vuoi dire che stavi compilando fact.h per produrre fact.o?

Se è così, questo non stava facendo quello che ti aspetti. Quando si invoca gcc su un file di intestazione, produce un'intestazione precompilata, non un file oggetto. Quindi, anche se hai un file chiamato foo.o non è stato un file oggetto valido. Se avete appena eseguito gcc -c fact.h, avrebbe prodotto un intestazione precompilato fact.gch, ma presumibilmente hai corso gcc -c fact.h -o fact.o che fa sì che il file sia chiamato fact.o anche se è ancora un'intestazione precompilata. file fact.o avrebbe dimostrato che:

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

È stato possibile forzare GCC per trattare il file come codice C, non un'intestazione, eseguendo gcc -x c -c fact.h -o fact.o (il -x c dice di trattare l'ingresso come codice C invece di dedurre il tipo dall'estensione del file) ma probabilmente è probabilmente più semplice e meno Confondere giustificare correttamente il tuo file invece di provare a compilare un'intestazione.

.

non sono le biblioteche possibili per creare senza almeno un file .c in esso?

hanno bisogno di almeno un file oggetto (cioè file .o) ma non hai avuto un oggetto valido, hai avuto un'intestazione precompilata in modo fuorviante come .o, ma in realtà non era un file oggetto.

.

Se non uso il -L/.../new, GCC dirà che non riesce a trovare "lfact", forse è perché non è in /usr/local/lib

Il linker non sembra solo in /usr/local/lib, ci sono altri luoghi predefiniti che sembra, ma sì, è fondamentalmente il problema. Si noti che è anche possibile dire -L. se la libreria è nella directory corrente, è più facile che dare un percorso assoluto.

Altri suggerimenti

Non sono sicuro che ar supporti un trattino su qualcosa di diverso dalla prima opzione.Prova

ar -rs libfact.a fact.o
.

o solo

ar rs libfact.a fact.o
.

mente tu, non so perché correre ranlib non ha funzionato però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top