[C] Code::Blocks i ncurses

0

Mam dość dziwny problem, otóż gdy kompiluję plik przez terminal - (gcc) to wszystko przebiega bezproblemowo. Natomiast gdy chcę zrobić to przez Code::Blocks to pojawiają mi się takie błędy:

obj/Debug/main.o||In function `main':|
main.c| 8| undefined reference to `initscr'|
main.c| 9| undefined reference to `printw'|
main.c|10| undefined reference to `stdscr'|
main.c|10| undefined reference to `wrefresh'|
main.c|12| undefined reference to `scanw'|
main.c|13| undefined reference to `endwin'|
||=== Build finished: 6 errors, 0 warnings ===|
 

Kod programu (chyba prostszy być nie może :) ) :

#include <stdlib.h>
#define GCC_PRINTF // co do tych dwóch defów - przeglądając nagłówek ncurses wyczytałem,
#define GCC_SCANF //  że usprawnia to sprawdzanie odwołań do printw i scanw - bez tego też nie działa
#include <ncurses.h>

int main()
{
    initscr();
    printw("Hello world!\n");
    refresh();
    int a;
    scanw("%i",&a);
    endwin();
    return 0;
}

Do opcji kompilatora dodałem -lncurses.

Pozdrawiam,
bOOsiu.

0

Najwyraźniej środowisko nie widzi ci tej biblioteki. Sprawdź ustawienia w jakich katalogach poszukuje bibliotek.

0

Dodałem ścieżkę do katalogów do przeszukania i nic. Poza tym gdyby nie znajdowało mi biblioteki nie powinno być jakiegoś ostrzeżenia do #include ?

Sprawdziłem programem ldd jakie biblioteki wchodzą w skład skompilowanego pliku ( wykomentowałem te fragmenty które miały funkcje z ncurses ) i oto wyniki:

Ręcznie kompilowane:
linux-vdso.so.1 => (0x00007fffc2ddb000)
libncurses.so.5 => /lib/libncurses.so.5 (0x00007f680bb6a000)
libc.so.6 => /lib/libc.so.6 (0x00007f680b7e7000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f680b5e2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f680bdd1000)

Kompilowane przez Code:
linux-vdso.so.1 => (0x00007fffc7bff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f65390e7000) // co tu robi ta biblioteka - ona jest związana z c++ ?
libm.so.6 => /lib/libm.so.6 (0x00007f6538e64000) // typ projektu to 'samo' c
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f6538c4c000)
libc.so.6 => /lib/libc.so.6 (0x00007f65388c9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f653941f000)

0

Nie chcę być zbyt mądry bo nie jestem w 100% pewien, ale wydaje mi się że projekt jest jednak kompilowany jako C++.

0

@ifk - aż stworzyłem nowy projekt uważnie patrząc, czy zaznaczam "C" jako typ projektu :))

	linux-vdso.so.1 =>  (0x00007fff8c3bb000)
__	libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fd334b50000)__
	libm.so.6 => /lib/libm.so.6 (0x00007fd3348cd000)
	libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fd3346b5000)
	libc.so.6 => /lib/libc.so.6 (0x00007fd334332000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fd334e88000)

i nadal jest tam ta biblioteka.

A ncurses nadal nie ma...

0

O Code::Blocks nie mam pojęcia, więc mogę głupoty pisać ;)
Uruchomilem Twój przykład w Code::Blocks - nie wiem co prawda jak zrobić projekt "C", zrobiłem empty i pokonfigurowałem.
Po dodaniu -lncurses do "Other linker options" skompilował się bezbłędnie, ale dalej zlinkowany z libstdc++. Jak przełączyłem poziom logowania buildowania na "full command line" to okazało się że jako linkera używa g++ - jeżeli zamiast niego użyć gcc, to zlinkował się normalnie.

0

Dodałem ścieżkę do katalogów do przeszukania i nic. Poza tym gdyby nie znajdowało mi biblioteki nie powinno być jakiegoś ostrzeżenia do #include ?
Co innego include, co innego biblioteka. Dodajesz gdzieś to ncurses w ogóle? w opcjach projektu.

0

:) Problem rozwiązany - jak często - głupi błąd.

ROZWIĄZANIE :
Dodawałem opcje -lncurses do kompilatora(zakładka compiler settings->other options) a nie do linkera(zakładka linker settings->other linker options).

Dzięki wszystkim za pomoc i sugestie.

EDIT:

ifk: Jak przełączyłem poziom logowania buildowania na "full command line"

Jak przełączyć się na ten poziom ?

0
bOOsiu napisał(a)

Jak przełączyć się na ten poziom ?

Tam gdzie się konfiguruje projekt (czyli między innymi opcje linkera), ostatnia zakładka, gdzieś na górze z tego co pamiętam :)

0

Dzięki raz jeszcze. :)

0

Próbuję właśnie skompilować jeden program i wyskakuje mi coś takiego:

michal@michal-desktop:~/Pulpit/SO2/so2-windy/so2-windy$ make
gcc -lpthread -lncurses -o elevator elevator.c
elevator.c21: error: ncurses.h: No such file or directory
In file included from elevator.c
elevator.h error: ‘COLOR_BLACK’ undeclared here (not in a function)
elevator.h error: ‘COLOR_YELLOW’ undeclared here (not in a function)
elevator.h error: ‘COLOR_WHITE’ undeclared here (not in a function)
elevator.h error: ‘COLOR_CYAN’ undeclared here (not in a function)
elevator.h error: ‘COLOR_BLUE’ undeclared here (not in a function)
elevator.h error: ‘COLOR_GREEN’ undeclared here (not in a function)
elevator.h error: ‘COLOR_RED’ undeclared here (not in a function)
elevator.h error: ‘COLOR_MAGENTA’ undeclared here (not in a function)
elevator.c: In function ‘Refresh’:
elevator.c error: ‘A_BOLD’ undeclared (first use in this function)
elevator.c error: (Each undeclared identifier is reported only once
elevator.c error: for each function it appears in.)
make: *** [elevator] Błąd 1

Powiedzcie mi dlaczego nie widzi podanych bibliotek i co zrobić żeby udało się go skompilować. Będę bardzo wdzięczny za podpowiedź.
Pozdrawiam
Michał

0

brakuje ci ncurses (albo ncurses-devel, albo jak tam się to w twojej dystrybucji nazywa)

1 użytkowników online, w tym zalogowanych: 0, gości: 1