• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program nie widzi libki math.h

VPS Starter Arubacloud
0 głosów
386 wizyt
pytanie zadane 22 października 2020 w C i C++ przez urbix01 Gaduła (3,290 p.)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

void zadanie_1()
{
    float x, w;
    printf("Prosze podac liczbe rzeczywista(float): ");
    scanf("%f", &x);
    if(x<0) w = 2.0*sqrt(x);
    else w = x + 1.0;
    printf("W = %f", w);
}

Witam oto fragment kodu C problem polega na tym że kompilator nie widzi libki, error brzmi:

undefined reference to `sqrt'

To samo jest przy pow(), czy ktoś jest wstanie mi wytłumaczyć dlaczego tak się dzieje.

1
komentarz 22 października 2020 przez tkz Nałogowiec (42,000 p.)
Jak kompilujesz?

2 odpowiedzi

+1 głos
odpowiedź 22 października 2020 przez Oscar Nałogowiec (29,290 p.)
wybrane 22 października 2020 przez urbix01
 
Najlepsza

Dodaj -lm do polecenia linkowania/kompilacji.

Wyjaśnienie - każda "biblioteka" w c to są dwa pliki (co najmniej) których używa się na innych etapach "kompilacji". Plik ".h" to jest plik tekstowy (w C) zawierający opis obiektów (zmiennych, funkcji itp) udostępnianych przez bibliotekę. Potrzebny jest kompilatorowi by wiedział jakie są te zewnętrzne obiekty i sprawdził zgodność. Plik dołącza się jawnie do kodu źródłowego poprzez #include. Drugi plik - (zwykle .lib) to skompilowany plik źródłowy (lub kilka) zawierający kody poszczególnych funkcji i zmienne. Ten plik należy podać do linkera jak będzie łączył skompilowane kawałki w jeden program.

To się podaje opcją -l. Dodatkowe opcje umożliwiają określenie katalogów gdzie mają być szukane różne typu plików.

 

komentarz 22 października 2020 przez urbix01 Gaduła (3,290 p.)
Pierwszy raz z czymś takim się spotkałem. Możesz mi pokazać w którym miejscu w kodzie to zalinkowac i jak to zrobic
komentarz 22 października 2020 przez Oscar Nałogowiec (29,290 p.)
To nie jest w kodzie, tylko w poleceniu linkowania. Proces budowania aplikacji typowo składa się z: kompilacji poszczególnych modułów (.c, .cpp => .o), ewentualnego połączenia ich w biblioteki (.o => .lib, .a) i linkowania (.o, .lib, .a => .exe). GCC to taki kombajn, który potrafi (wywołuje zewnętrzne programy) wykonać różne etapy tego procesu a także zrobić od po kolei wszystko. Pod spodem wywołuje polecenia cc, ld, itp. Tak jak napisał w swojej odpowiedzi tangarr, to co musisz zrobić zależy od tego z jakiego kompilatora i (jeśli w ogóle) środowiska IDE korzystasz. Jeśli pracujesz z linii poleceń, ewentualnie masz jakiś skrypt lub makefile to bezpośrednio do wywołania linkera (ale też do gcc) trzeba po prostu dodać parametr -lm (co znaczy dodaj bibliotekę m.lib). Różne środowiska graficzne typu IDE najczęściej mają twór zwany projektem, gdzie określasz z czego składa się program i różne parametry kompilacji i linkowania. Potem środowisko odpowiednio dobiera parametry wywołania kompilatora i linkera i je wołą. Jak podasz z czego korzystasz to być może ktoś zaznajomiony z danym programem poda konkretnie gdzie i co masz wpisać.

 

Oczywiście na początkowym etapie nauki możesz mieć z tym problem i traktować to jak czarną magię, ale tak w sumie jest bardzo często - dopóki nie ogarnie się takiego minimum trzeba wiele rzeczy przyjmować "na wiarę", dopiero w pewnym momencie zaczyna się wiedza składać w jakąś spójną całość.
komentarz 22 października 2020 przez urbix01 Gaduła (3,290 p.)
Korzystam z codeblocksa IDE
+1 głos
odpowiedź 22 października 2020 przez tangarr Mędrzec (154,780 p.)

Kompilator nie ma z tym kodem żadnego problemu.
Problem ma linker, ponieważ nie potrafi dołączyć do programu skompilowanego kodu funkcji sqrt.

Musisz przekazać odpowiednią flagę do linkera (zazwyczaj -lm). Jeżeli kompilujesz program przy pomocy gcc z linii poleceń wystarczy wywołać

gcc moj_program.c -lm

Jeżeli używasz jakiegoś środowiska programistycznego to musisz znaleźć w jego dokumentacji w jaki sposób linkować biblioteki.

Podobne pytania

0 głosów
2 odpowiedzi 5,534 wizyt
pytanie zadane 28 grudnia 2017 w C i C++ przez KacperO Nowicjusz (210 p.)
0 głosów
1 odpowiedź 258 wizyt
pytanie zadane 22 listopada 2018 w C i C++ przez Wiktor Panecki Użytkownik (920 p.)
0 głosów
2 odpowiedzi 783 wizyt
pytanie zadane 22 listopada 2016 w C i C++ przez Kenzi Nowicjusz (200 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...