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

C - [własny plik nagłówkowy i źródłowy; wskaźnik na funkcje] undefinied reference to ...

Object Storage Arubacloud
0 głosów
703 wizyt
pytanie zadane 15 października 2015 w C i C++ przez baszmest Gaduła (3,080 p.)
edycja 15 października 2015 przez baszmest

Witam, piszę program w C na Linux/Unix - (a dokładniej w PuTTY na serwerze uczelni - nie wiem czy ma to znaczenie smiley), który całkuje numerycznie metoda trapezów. 

Mam trzy pliki :

EDIT: Zapomniałem napisać że test.c i calnum.h były już gotowe napisane. Moim zadaniem było napisać tylko plik calnum.c

Główny: test.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "calnum.h"

double f( double x )
{
    return x*sin(x);
}

int main( int argc, char **argv)
{
    double a = argc > 1 ? atof(argv[1]) : 0;
    double b = argc > 2 ? atof(argv[2]) : M_PI;
    int n = argc > 3 ? atoi(argv[3]) : 1000;

    double (*func) (double) = f; // to dodałem od siebie - ale nie pomoglo :)

    printf( "Int <%g,%g>[%i] (x*sin(x) ) = %g\n", a, b, n, calnum(func, a, b, n));

    return 0;

}

Plik nagłowkowy calnum.h

#ifndef calnum_h
#define calnum_h

double calnum ( double (*f)(double), double a, double b, int n );

#endif // calnum_h

Plik źródłowy calnum.c:

#include "calnum.h"

double calnum (double (*f) (double), double a, double b, int n)
{
    double suma = 0;
    double i;
    double d = (b - a) / n;

    for(i = 0; i < n; i++)
    {
        suma += (f(a + i*d) + f(a + (i+1)*d)) /2 * d;
    }

    return suma;
}

 

Gdy chcę skompliować test.c:    cc -Wall test.c -lm      dostaje taki błąd:

In function `main' :
test.c: (text+0xbb) : undefinied reference to `calnum'
collect2: ld returned 1 exit status

Wszystkie pliki mam w jednym folderze. Znalazłem podobny temat: https://forum.pasja-informatyki.pl/63474/wlasny-plik-naglowkowy-code-blocks-undefined-reference-to  jednak dotyczyl Code::Blocks. Możliwe że skopałem coś gdzieś w kodzie. Z góry dzięki :)

2 odpowiedzi

+1 głos
odpowiedź 15 października 2015 przez Szykem2 Nałogowiec (29,510 p.)
wybrane 15 października 2015 przez baszmest
 
Najlepsza

Wadług mnie chodzi o to, że kompilator widzi tylko deklaracje funkcji na etapie kompiownia. W pliku .h  zrób

extern double calnum ( double (*f)(double), double a, double b, int n );

Powinno pomóc.

komentarz 15 października 2015 przez Szykem2 Nałogowiec (29,510 p.)
edycja 15 października 2015 przez Szykem2

aha i musisz skompilować plik calnum.cpp

gcc -Wall -g test.c calnum.c -o -lm a.out

ta kompenda skompiluje do pliku wykonywalnego a.out i wywali wszystkie błędy jakie masz jeśli jakieś są.

komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)
Niestety nie :( Właściwie to plik .h jak i test.c powinny nie byc zmienione bo były dane jako gotowce, moim zadaniem było napisanie pliku calnum.c ( do gotowca dodałem jedną linie od siebie ale nie pomogła ) zaraz zedytuje post..
komentarz 15 października 2015 przez Szykem2 Nałogowiec (29,510 p.)
No to tylko kompilacja powinna załatwić sprawe tak jak w komentarzu napisałem.
komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)
k dzięki, zacząłem pisac moj komentarz zanim pojawił się twój. rzeczywiście to by pomogło. :)
+1 głos
odpowiedź 15 października 2015 przez furas Maniak (53,800 p.)
Musisz skompilować też calnum.c

cc -Wall test.c calnum.c -lm

ps. najwygodniej zrobić sobie plik `makefile` i potem wystarczy tylko wydać komendę `make` aby sprawdziło, które pliki zostały zmienione i przekompilowało co należy.
komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)

Tak proste - próbowałem różne opcje kompilacji, a na to nie wpadłem. :) Dzięki, to pomogło.

komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)
Miałem dylemat komu dać "Najlepszą odpowiedź"  - Szykem2 był chyba szybszy, sorry :)
komentarz 15 października 2015 przez furas Maniak (53,800 p.)
też mi się wydaje, że Szykem2 był szybszy :)

Polecam za to używanie makefile - mniej pisania przy uruchamianiu kolejnych kompilacji :)
komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)
w linuxie jestem zielony. podaj przykład jak tego uzyc, a będę ci wdzięczny :D
komentarz 15 października 2015 przez furas Maniak (53,800 p.)
edycja 15 października 2015 przez furas
calnum: test.c calnum.c calnum.h
    cc -Wall test.c calnum.c -o calnum -lm

W powyższym założyłem, że plik wynikowy będzie nazywał się calnum.

Całość trzeba zapisać w pliku `makefile` (małe litery).

Pierwsza lini sprawdza czy istnieje już plik o nazwie `calnum` i czy jest on młodszy od plików `test.c`, `calnum.c` i `calnum.h`. Jeśli nie ma jeszcz skompilowanego `calnum` lub jest on starszy od wymienionych plików (czyli od ostatniej kompilacji, w którymś z nich coś zmieniono) to wykonuje linie które są poniżej. 

Druga linia musi mieć wcięcie zrobione tabulatorem. Jeśli masz edytor, który zamienia tabulatory na spacje to wywołanie komendy `make` poda, że jest błąd "makefile:2: *** brakujący separator. Stop." 

Poniżej pierwszego wcięcia możesz dać kolejną linię z wcięciem i komendą, która też ma być wykonana przy kompilacji. 

Potem wystarczy w konsoli wydać komendę `make` a on poszuka w katalogu pliku `makefile` i wykona to co opisałem powyżej.

---

W pliku może być więcej takich reguł (oddzielonych pustymi liniami) np. osobna reguła usuwająca wszelkie pliki tymczasowych *.o oraz a.out ale w tym projekcie to nie będzie potrzebne.

 

 

komentarz 15 października 2015 przez baszmest Gaduła (3,080 p.)
Ok, Dzięki, przyda się :)

Podobne pytania

+1 głos
2 odpowiedzi 1,341 wizyt
0 głosów
1 odpowiedź 242 wizyt
pytanie zadane 4 listopada 2015 w C i C++ przez benzulli Użytkownik (720 p.)
+1 głos
1 odpowiedź 475 wizyt
pytanie zadane 28 maja 2016 w C i C++ przez komo23 Nowicjusz (130 p.)

92,626 zapytań

141,486 odpowiedzi

319,846 komentarzy

62,009 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...