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.

questionAnswers(3)

yourAnswerToTheQuestion