@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Почему в gcc не подключается?

Вот мой код:
#include <stdio.h>
#include <math.h>



double time(float x){
	return 5.0*sqrt(x*x + 36.0) + 4.0*(20.0 - x);
}

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;
}

При компиляции выдает вот это:
$ gcc ./cro.c
/tmp/ccqtObxh.o: In function `time':
cro.c:(.text+0x28): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

Однако, если указать опцию '-lm', то все компилируется.
Зачем нужна эта опция? что она делает? почему недостаточно просто #include прописать?
А если у меня будет 10 библиотек подключенно, мне для каждой какую-то опцию писать?
  • Вопрос задан
  • 400 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Alexander1705
Библиотека != заголовочный файл.

Заголовочный файл содержит только объявления (т.е. описания). Например:
// 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 сложилось по историческим причинам.
Ответ написан
@res2001
Developer, ex-admin
Видимо потому, что в gcc математические функции вынесены в отдельную библиотеку - libm.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы