Non credo che sia il comando è in esecuzione (beh, può essere uno di loro, ma non è certamente quello che causa l'errore).
L'opzione -c
su gcc
indica di creare solo i file oggetto (e in particolare si invia l'output a sparse_matrix.o
, un file oggetto anziché uno eseguibile).
In tal caso, il linker deve non essere chiamato a tutti.
Infatti, con un manichino sparse_matrix.c
di:
#include <math.h>
int main(void) {
return (int)(sqrt(16.0));
}
tuo comando funziona bene e, quando ho completare il processo con:
pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4
si può vedere che funziona anche bene.
Può essere che si sta lasciando fuori le bandiere linker (come -lm
) dalla effettiva collegamento fase, che potrebbe causare questo problema. Non dovrebbero avere alcun effetto sulla fase di compilazione (a meno che non influiscano su entrambe le fasi di collegamento e ma lo -l
non sia uno di quelli).
E, per "lasciare", includo anche la possibilità di "errato". Alcuni linker sono posizionali nel modo in cui gestiscono le librerie in quanto estraggono solo oggetti dalle librerie se soddisfano un simbolo non definito nel punto in cui sono elencati.
Così, il comando:
linker sparse_matrix.o -lm ...
avrebbe funzionato perché il file .o
introduce un riferimento insoddisfatto per sqrt
, che viene soddisfatta da libm
.Se il linker è posizionale, quindi:
linker -lm sparse_matrix.o ...
non avrebbe funzionato perché, al momento della lavorazione libm
, c'erano non simboli insoddisfatti quindi nulla è stato estratto. Il riferimento non definito a sqrt
viene quindi introdotto dopo in quel punto e non ci sono altri oggetti o librerie per soddisfarlo.
Se lo stadio di collegamento ld
o gcc
ha questa limitazione, non lo so, sto solo aumentando la possibilità come qualcosa a cui prestare attenzione.
L'opzione '-c' sopprime il collegamento. Non riceverai quell'errore da quella riga di comando. Pertanto, quella non è la riga di comando che produce l'errore. (Non usare @ before rules in un 'makefile' - probabilmente non è un tuo problema, ma nasconde i comandi e può essere fuorviante.) E la maggior parte di questo è ciò che dice @paxdiablo. –
possibile duplicato di ["riferimento non definito a \' pow "" anche con math.h e il link della libreria -lm] (http://stackoverflow.com/questions/16344445/undefined-reference-to-pow-even-with -math-h-and-the-library-link-lm) –