Nowe posty

Autor Wątek: Pliki nagłówkowe C, eclipse  (Przeczytany 8665 razy)

schizo

  • Gość
Pliki nagłówkowe C, eclipse
« dnia: 2008-01-09, 00:13:09 »
Cześć, mam takie dość prozaincze pytanie czemu to nie działa:

Mam 3 pliki:

// biblioteka.h

#ifndef _biblioteka_h_
#define _biblioteka_h_

void wypisz(void);


#endif

}


// biblioteka.c

#include
#include
#include "biblioteka.h"


void wypisz(void){
   printf("ala");
   
}


// klient.c

#include  "/home/mario/ZSO/biblioteka/src/biblioteka.h"

int main(void) {
   wypisz();

return 0;
}

W eclipse dostaje cos takiego przy próbie kompilacji pliku "klient.c":
**** Build of configuration Debug for project klient ****

make all
Building target: klient
Invoking: GCC C Linker
gcc  -o"klient"  ./src/klient.o  
./src/klient.o: In function `main':
/home/mario/ZSO/klient/Debug/../src/klient.c:26: undefined reference to `wypisz'
collect2: ld returned 1 exit status
make: *** [klient] Błąd 1

Czyli nie widzisz mi metody, którą powinien widzieć, co dziwne jak wcisne ctrl+spacja eclipse pokazuje mi że jest taka metoda :) czyli tak jakby eclipse widziało to z tego pliku nagłowkowego ale kompilator już nie bardzo :/
Gubię się w tym gaszczu tej struktury :/ w visual studio pod windowsa było jakoś prościej, no ale program pod linuxa musze napisać :/

Ktoś wie o co chodzi w tym ?

Wielkie dzięki z góry :)

chmooreck

  • Gość
Pliki nagłówkowe C, eclipse
« Odpowiedź #1 dnia: 2008-01-09, 07:11:48 »
Przy kompilacji widzi, nie widzi przy linkowaniu...
sprawdź opcje linkowania, musisz ją dolinkować

  • Gość
Pliki nagłówkowe C, eclipse
« Odpowiedź #2 dnia: 2008-01-09, 10:30:20 »
taka mała uwaga co do kodu w klient.c - nigdy nie podawaj pełnej ścieżki do plików nagłówkowych. Zamiast tego, napisz:
#include
i podczas kompilacji podaj ścieżkę do katalogu z nagłówkiem (za pomocą opcji -I (litera to duże i)). Albo najlepiej podczas konfiguracji projektu (CFLAGS="-Iścieżka_do_katalogu).

schizo

  • Gość
Pliki nagłówkowe C, eclipse
« Odpowiedź #3 dnia: 2008-01-09, 17:00:51 »
Kurcze nie wiem co robie źle ale chyba to dlam nie za trudne :/

Biorę w Eclipse w menu Project->properties-> C/c++ build -> Settings-> GCC C Linker-> add Libraries (-I) dodaje tam:
/home/mario/ZSO/biblioteka/src

i przy próbie kompialcji wywala mi:

**** Build of configuration Debug for project klient ****

make all
Building target: klient
Invoking: GCC C Linker
gcc  -o"klient"  ./src/klient.o   -l/home/mario/ZSO/biblioteka/src
/usr/bin/ld: cannot find -l/home/mario/ZSO/biblioteka/src
collect2: ld returned 1 exit status
make: *** [klient] Błąd 1


Usuwam to i próbuję dodać:

Biorę w Eclipse w menu Project->properties-> C/c++ build -> Settings-> GCC C Compieler-> Directories -> Include paths(-I) i dodaje ścieżkę /home/mario/ZSO/biblioteka/src Wywala mi błąd:

**** Build of configuration Debug for project klient ****

make all
Building target: klient
Invoking: GCC C Linker
gcc  -o"klient"  ./src/klient.o  
./src/klient.o: In function `main':
/home/mario/ZSO/klient/Debug/../src/klient.c:27: undefined reference to `wypisz'
collect2: ld returned 1 exit status
make: *** [klient] Błąd 1


Mógł by mi ktos powiedzieć co i jak ;> ? bo eclipse ma 1000 opcji :) pod windowsem pisałem w nim wiele razty w javie i było spoko a tu nie mogę tego pojać :/ siedze nad tym 2 dzień zamiast pisać program :/

Struktóre mam taką:


/home/mario/ZSO/biblioteka/src
/home/mario/ZSO/klient/src
/home/mario/ZSO/serwer/src

ZSO to workspace a biblioteka/klient/serwer to projekty. Klient ma includować funkcje biblioteczne: połącz odłacz itp.
Czemu nie działa to linkowanie ? :(

  • Gość
Pliki nagłówkowe C, eclipse
« Odpowiedź #4 dnia: 2008-01-10, 10:59:17 »
Cytat: schizo
Kurcze nie wiem co robie źle ale chyba to dlam nie za trudne :/

Biorę w Eclipse w menu Project->properties-> C/c++ build -> Settings-> GCC C Linker-> add Libraries (-I) dodaje tam:
/home/mario/ZSO/biblioteka/src
(...)
gcc  -o"klient"  ./src/klient.o   -l/home/mario/ZSO/biblioteka/src
Po kolei.

Dodawanie bibliotek:
-lbiblioteka
czyli małe L.

Dodawanie katalogów z nagłówkami:
-Iścieżka_do_katalogu
czyli duże i.

Wiem, że jest to bardzo mylące, szczególnie gdy używa się czcionki bezszeryfowej, no ale co zrobić.

Piszesz, że wybierasz "Add libraries", czyli wybierasz dodwanie bibliotek, a wskazujesz katalog... W add libraries dodaj plik biblioteki "biblioteka" (czyli w twoim przypadku będzie to pewnie "/home/mario/ZSO/biblioteka/src/biblioteka.o")

Jest jeszcze taka kwestia, że w systemach UNIX nie powinno się linkować do bibliotek znajdujących się w innych katalogach niż ststemowe (czyli /usr/lib albo /usr/local/lib) bo gdy uruchomisz tak skompilowany program na innym systemie, to będziesz musiał bibliotekę umieścić w takim samym katalogu. (czyli mówiąc krótko - po napisaniu biblioteki powinieneś ją zainstalować w systemie, a dopiero potem kompilować program, który z niej kożysta). Ale jeśli jest to program w ramach nauki programowania (tak przynajmniej ciebie zrozumiałem), to nie ma najmniejszego problemu - za pewne na zajęciach będziesz go przekompilowywał, więc tam ustawisz inne ścieżki po prostu.

Co do tego, co pisałem w poprzednim poście - dodawanie katalogów nagłówkowych do konfiguracji projektu także jest niezbędne dla przenośności kodu. Jeśli chcesz kompilować ten program na innym systemie, to zamień
#include  "/home/mario/ZSO/biblioteka/src/biblioteka.h"
na
#include  
i w konfiguracji projektu znajdź coś w stylu "Add directories" i tam wpisz ścieżkę  "/home/mario/ZSO/biblioteka/src".