Nie sądzę, że jest polecenie używasz (no, może to być jeden z nich, ale nie jest to z pewnością jeden powodując błąd).
Opcja -c
na gcc
mówi, że należy utworzyć tylko pliki obiektów (a konkretnie wysyłane są dane wyjściowe do pliku obiektu sparse_matrix.o
, a nie pliku wykonywalnego).
W takim przypadku linker powinien być w całości nazwany , a nie.
W rzeczywistości, z manekina sparse_matrix.c
z:
#include <math.h>
int main(void) {
return (int)(sqrt(16.0));
}
swoją komenda działa dobrze, a kiedy zakończyć proces z:
pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4
widać, że również działa dobrze.
Może to oznaczać, że opuszczasz flagę łącznika (taką jak -lm
) z rzeczywistego etapu połączenie, co może spowodować ten problem. Nie powinny one mieć wpływu na etap kompilacji (chyba że mają wpływ na oba etapy połączenia, ale -l
nie jest jednym z nich).
I, przez "odstąpienie", włączam również możliwość "niewłaściwego rozmieszczenia". Niektóre łączniki są pozycyjne w sposobie obsługi bibliotek, ponieważ będą wyodrębniać obiekty z bibliotek, jeśli spełniają nieokreślony symbol w miejscu, w którym są wymienione.
więc polecenie:
linker sparse_matrix.o -lm ...
będzie działać, ponieważ plik .o
wprowadza niezadowolony odniesienie do sqrt
, co jest realizowane przez libm
.Jeśli łącznik jest pozycyjny, a następnie:
linker -lm sparse_matrix.o ...
nie będzie działać, bo w czasie przetwarzania libm
było żadnych niezaspokojone symbole tak nic nie zostało wydobyte. Nieokreślone odniesienie do sqrt
jest następnie wprowadzane jako po tym punkcie i nie ma żadnych innych obiektów ani bibliotek, które by to zaspokajały.
Niezależnie od tego, czy etap łącznikowy ld
, czy gcc
ma to ograniczenie, nie wiem, po prostu podnosimy tę możliwość jako coś, na co należy zwrócić uwagę.
Opcja '-c' pomija łączenie. Nie dostaniesz tego błędu z tego wiersza poleceń. Dlatego nie jest to linia poleceń, która powoduje błąd. (Nie używaj @ przed regułami w 'makefile' - to prawdopodobnie nie jest twój problem, ale ukrywa polecenia i może wprowadzić Cię w błąd.) A większość tego właśnie powiedziała @paxdiablo. –
możliwy duplikat ["niezdefiniowane odwołanie do \" pow '"nawet z math.h i linkiem biblioteki -lm] (http://stackoverflow.com/questions/16344445/undefined-reference-to-pow-even-with -math-h-and-the-library-link-lm) –