Dlaczego -lm nie jest konieczne w niektórych przypadkach podczas kompilowania i łączenia kodu C?
Mam tutaj przykładowy plik:
#include <stdio.h>
#include <math.h>
int main(){
printf("%f\n", log(10));
}
Kiedy go kompilujęgcc sample.c -o a
działa dobrze. Mogę to uruchomić./a
i wytwarza wyjście2.302585
jak się spodziewałem.
Jednak gdy mój plik wygląda tak:
#include <stdio.h>
#include <math.h>
int main(){
double a = 10;
printf("%f\n", log(a));
}
nie kompiluje się zgcc sample.c -o a
. Zamiast tego muszę użyćgcc sample.c -o a -lm
więc mogę najwyraźniej powiedzieć mu, żeby „powiązał matematykę” ... Tak naprawdę nie śledzę tego, dlaczego nie miałbym powiązać matematyki w pierwszym przykładzie? A co dokładnie oznacza nawet „połączenie matematyki”? Minęło trochę czasu odkąd pracowałem z kompilatorami C, więc wybacz mi, jeśli to jest złe pytanie.