Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 11:01 Der er 30 kommentarer og
2 løsninger

undefined reference to

Jeg er ved at lave en simpel menu med ncurses. Men har fået nogle problemer tidligt. Jeg har copy pastet det fra en tutorial fra nettet, men den vil ikke compile. Får følgende fejl

/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:46: undefined reference to `new_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:49: undefined reference to `new_menu'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:51: undefined reference to `post_menu'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:57: undefined reference to `menu_driver'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:60: undefined reference to `menu_driver'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:65: undefined reference to `free_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:66: undefined reference to `free_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:67: undefined reference to `free_menu'

Her er min main funktion, hvor fejlen ligger

int main()
{
    ITEM **my_items;
    int c;               
    MENU *my_menu;
    int n_choices, i;
    ITEM *cur_item;

    int row,col;
   
    initscr();
    noecho();
        nonl();
        cbreak();

    start_color();
    init_pair(1, COLOR_WHITE, COLOR_BLUE);
    attrset(COLOR_PAIR(1));

    for(row=0;row<25;row++)
        for(col=0;col<80;col++)
            mvprintw(row,col," ");
    mvprintw(0,0,"Welcome to Fluxbox installer and configurator v 0.1");
    refresh();

    n_choices = ARRAY_SIZE(choices);
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));

    for(i = 0; i < n_choices; ++i)
            my_items[i] = new_item(choices[i], choices[i]);
    my_items[n_choices] = (ITEM *)NULL;

    my_menu = new_menu((ITEM **)my_items);
    mvprintw(LINES - 2, 0, "F1 to Exit");
    post_menu(my_menu);
    refresh();

    while((c = getch()) != KEY_F(1))
    {  switch(c)
        {    case KEY_DOWN:
                menu_driver(my_menu, REQ_DOWN_ITEM);
                break;
            case KEY_UP:
                menu_driver(my_menu, REQ_UP_ITEM);
                break;
        }
    }   

    free_item(my_items[0]);
    free_item(my_items[1]);
    free_menu(my_menu);
    getch();
    endwin();
    return 0;
}
Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 11:03 #1
choices er et char array

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };
Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 11:04 #2
Der er et par små fejl kan jeg se, så som getch(); i bunden af main. Men det er ikke det der er galt
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:09 #3
Jeg tror at du mangler at builde/linke med det som indeholder de funktioner.
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:10 #4
Husk at hvis du har mere end en .c fil så er det enten:

gcc -c one.c -o one.o
gcc -c two.c -o two.o
gcc one-o two.o -o one

eller

gcc one.c two.c -o one
Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 14:35 #5
Ville egentlig gerne compile med g++, da resten af funktioner er lavet i c++ og ikke c. Hvad kan jeg gøre ved det?
Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 14:41 #6
De funktioner skulle gerne ligge i menu.h? #include "menu.h" skulle vel gøre det?
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:46 #7
så erstat gcc med g++ i de kommandoer !
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:47 #8
Nej.

#include "menu.h"

gør at dit program kender data typer og funktions prototyper.

Du skal stadig have koden linket ind.
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:48 #9
Hvis det ikke er din kode så er det muligt at det ligger som en libmenu.a og at du skal

g++ ditprogram.cpp libmenu.a -o ditprogram
Avatar billede arne_v Ekspert
24. oktober 2007 - 14:50 #10
Nu kan jeg se at du også udvikleri C#.

Har du overvejet at installere Mono på din Linux/Unix box og så kode app
i C# med brug af GTK library ?

Det vil være noget nemmere end ncurses.

Men vil også kræve at brugeren har X kørende.
Avatar billede alex_sleiborg Nybegynder
24. oktober 2007 - 22:17 #11
Ja, har lavet en del i mono. Men ideen med netop denne app, er netop at X ikke skal være startet eller installeret. Og nu har jeg lavet det meste af det i C++, selve det der skal installere og configurere systemet. Så ville egentlig bare lave et grafisk interface, så man kan fravælge nogle ting. Og tilpasse installationen til sit eget behov. Og det er nu også en udfordring at lave det med ncurses, da jeg aldrig har brugt det før. Men skal nok få det lært :)
Jeg prøver lige og teste det her imorgen
Avatar billede alex_sleiborg Nybegynder
25. oktober 2007 - 09:00 #12
Den skriver at libmenu.a ingen sådan fil eller filkatalog. Er det fordi at det library ikke er installeret?
Avatar billede segmose Nybegynder
25. oktober 2007 - 09:25 #13
Her:
my_items[i] = new_item(choices[i], choices[i]);

Hvor er new_item defineret og implementeret?
Avatar billede alex_sleiborg Nybegynder
25. oktober 2007 - 09:33 #14
Vil egentlig tro new_item er en funktion der ligger i menu.h header filen
Avatar billede segmose Nybegynder
25. oktober 2007 - 10:09 #15
Jeg ville uden at kende hverken menu.h eller menu.cpp gætte på at den er defineret i menu.h og implementeret i menu.cpp og derfor får du en linker fejl hvis du ikke linker menu.o (eller libmenu.a hvis det er en library) med din main.
Avatar billede alex_sleiborg Nybegynder
25. oktober 2007 - 10:31 #16
Det er hvad den skriver, når jeg prøver at compile.

#include <menu.h>
#include <iostream>
#include <curses.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#define CTRLD 4

using namespace std;

char *choices[] = {
                        "Choice 1",
                        "Choice 2",
                        "Choice 3",
                        "Choice 4",
                        "Exit",
                  };
int main()
{
    ITEM **my_items;
    int c;               
    MENU *my_menu;
    int n_choices, i;
    ITEM *cur_item;

    int row,col;
   
    initscr();
    noecho();
        nonl();
        cbreak();

    start_color();
    init_pair(1, COLOR_WHITE, COLOR_BLUE);
    attrset(COLOR_PAIR(1));

    for(row=0;row<25;row++)
        for(col=0;col<80;col++)
            mvprintw(row,col," ");
    mvprintw(0,0,"Welcome to Fluxbox installer and configurator v 0.1");
    refresh();

    n_choices = ARRAY_SIZE(choices);
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *));

    for(i = 0; i < n_choices; ++i)
            my_items[i] = new_item(choices[i], choices[i]);
    my_items[n_choices] = (ITEM *)NULL;

    my_menu = new_menu((ITEM **)my_items);
    mvprintw(LINES - 2, 0, "F1 to Exit");
    post_menu(my_menu);
    refresh();

    while((c = getch()) != KEY_F(1))
    {  switch(c)
        {    case KEY_DOWN:
                menu_driver(my_menu, REQ_DOWN_ITEM);
                break;
            case KEY_UP:
                menu_driver(my_menu, REQ_UP_ITEM);
                break;
        }
    }   

    free_item(my_items[0]);
    free_item(my_items[1]);
    free_menu(my_menu);
    getch();
    endwin();
    return 0;
}

Her fejlen

cd '/source/cpp/fluxboxinstaller/debug' && WANT_AUTOCONF_2_5="1" WANT_AUTOMAKE_1_6="1" make -k
Making all in src
make[1]: Går til katalog '/source/cpp/fluxboxinstaller/debug/src'
g++ -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"fluxboxinstaller\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBNCURSES=1 -I. -I/source/cpp/fluxboxinstaller/src -O0 -g3 -MT fluxboxinstaller.o -MD -MP -MF .deps/fluxboxinstaller.Tpo -c -o fluxboxinstaller.o /source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp
mv -f .deps/fluxboxinstaller.Tpo .deps/fluxboxinstaller.Po
g++ -O0 -g3 -o fluxboxinstaller fluxboxinstaller.o -lncurses
fluxboxinstaller.o: I funktionen "main":
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:46: undefined reference to `new_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:49: undefined reference to `new_menu'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:51: undefined reference to `post_menu'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:57: undefined reference to `menu_driver'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:60: undefined reference to `menu_driver'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:65: undefined reference to `free_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:66: undefined reference to `free_item'
/source/cpp/fluxboxinstaller/src/fluxboxinstaller.cpp:67: undefined reference to `free_menu'
collect2: ld returned 1 exit status
make[1]: *** [fluxboxinstaller] Fejl 1
make[1]: Målet 'all' ikke genskabt på grund af fejl.
make[1]: Forlader katalog '/source/cpp/fluxboxinstaller/debug/src'
make[1]: Går til katalog '/source/cpp/fluxboxinstaller/debug'
make[1]: Ingenting at gøre for 'all-am'.
make[1]: Forlader katalog '/source/cpp/fluxboxinstaller/debug'
make: *** [all-recursive] Fejl 1
make: Målet 'all' ikke genskabt på grund af fejl.
*** Exited with status: 2 ***

De andre funktioner der skal implementeres, ligger i et andet projektet og andre kildefiler... Men
vil først lige prøve at lave et simpelt menu system
Avatar billede segmose Nybegynder
25. oktober 2007 - 10:54 #17
Ja det er en linker fejl, linkeren kan ikke finde den library som indeholer new_item, det kunne være en manglende path eller manglende bibliotek.
Måske mangler der bare en -Lxxx eller -lxxx i din make.

Jeg læste noget om at man skulle bruge en dev udgave af ncurses til visse ting.
Avatar billede arne_v Ekspert
26. oktober 2007 - 03:02 #18
Hvis du har en menu.cpp så skal den tilføjes til din makefile !
Avatar billede alex_sleiborg Nybegynder
26. oktober 2007 - 10:27 #19
Der eksistere kun den ene kildefil, alle andre filer er blevet oprettet af kdevelop...
Avatar billede alex_sleiborg Nybegynder
26. oktober 2007 - 10:28 #20
Libncurses5-dev er installeret
Avatar billede segmose Nybegynder
29. oktober 2007 - 11:24 #21
Hej
  Find ud af om der findes en libmenu.a.
Find stedet i kdevelop hvor du sætter linker biblioteker og tilføj pathen til libmenu.a og/eller libncurses.a, hvis den findes tilføj libmenu.a til de filer der skal linkes ind (project->options->linker options).
Avatar billede alex_sleiborg Nybegynder
29. oktober 2007 - 14:09 #22
Jeg kan godt finde libmenu.a og libncurses.a, de ligger i /usr/lib. Men kan ikke finde et sted, hvor jeg kan tilføje dem i kdevelop... Kan godt finde projekt options
Avatar billede arne_v Ekspert
29. oktober 2007 - 14:15 #23
tilfoej en option:

-lmenu
Avatar billede alex_sleiborg Nybegynder
29. oktober 2007 - 14:17 #24
Men de filer er jo binære... Jeg troede egentlig det var nok bare at tilføje header filer
Avatar billede arne_v Ekspert
29. oktober 2007 - 14:27 #25
Det er de.

.h indeholder en beskrivelse af hvordan funktionerne kan kaldes mens .a indeholder
den kode som udfoeres naar du kalder funktionerne !
Avatar billede alex_sleiborg Nybegynder
30. oktober 2007 - 13:52 #26
Men det er jo kun de funktioner der skulle findes i menu.h filen, som det er problemer med. De almindelige ncurses funktioner virker jo fint...

http://www.linux-tutorial.info/modules.php?name=Howto&pagename=NCURSES-Programming-HOWTO/menus.html#MENUBASICS

Afsnit 17... Er der nogen der kan compile det første eksempel?
Avatar billede alex_sleiborg Nybegynder
30. oktober 2007 - 14:01 #27
Så fik jeg den sgu til at compile... Smid et svar begge 2...
Gik bare ud i en terminal og brugte g++ <filename> -lmenu -lncurses
Avatar billede segmose Nybegynder
30. oktober 2007 - 14:11 #28
svar
Avatar billede arne_v Ekspert
30. oktober 2007 - 14:13 #29
svar
Avatar billede alex_sleiborg Nybegynder
30. oktober 2007 - 14:24 #30
Jeg kan se når jeg compiler direkte inde fra kdevelop, at den mangler at tage -lmenu med. Hvordan får jeg den til at tage den med, når den bruger g++?
Avatar billede segmose Nybegynder
30. oktober 2007 - 15:04 #31
I projects -> options -> linker

enten klik biblioteket af eller tilføj det på tekst linien.

jeg ved så ikke om du skal skrive det korte "menu" eller libmenu.a eller med -l foran.
Avatar billede arne_v Ekspert
30. oktober 2007 - 23:07 #32
det er enten:
  -lmenu
eller:
  libmenu.a
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Cognizant Technology Solutions Denmark ApS

Sr. Test Analyst

Danske Spil A/S

Erfaren UI Designer

SporingsGruppen ApS

Backend-udvikler