Библиотека != заголовочный файл.
Заголовочный файл содержит только объявления (т.е. описания). Например:
// time.h
#ifndef TIME_H
#define TIME_H
double time(float x);
#endif
Реализация может быть в отдельном файле.
// time.c
#include "time.h"
#include <math.h>
double time(float x){
return 5.0*sqrt(x*x + 36.0) + 4.0*(20.0 - x);
}
Чтобы каждый раз этот код не компилировать, можно скомпилировать его однажды в библиотеку:
gcc -c time.c -o time.o # Создаём объектный файл (скомпилированый код)
ar rcs libtime.a time.o # Создаём статическую библиотеку (по сути, архив объектных файлов)
А потом только подключать её:
gcc main.c -ltime
// main.c
#include <stdio.h>
#include <math.h>
#include "time.h"
int main(){
double l = 0;
double r = 20;
for(int i = 0; i < 1000; i++){
double mid = (r+l)/2;
double tl = mid - mid/10;
double tr = mid + mid/10;
if(time(tl) < time(tr))
r = tr;
else
l = tl;
}
printf("x = %g; t = %g\n", (l+r)/2, time((l+r)/2));
return 0;
}
P.S. -l
- сокращение от слова link (связывать).
P.P.S. Разделение libc и libm сложилось по историческим причинам.