Не могу скомпилировать ncurses и string одновременно - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время я учусь использовать c ++ и ncurses. После обучения на Youtube я не смог это сделать из-за ошибки, возникшей при попытке скомпилировать файл cpp. Имя файла: Select. cpp, поэтому я использую командную строку gcc -o SELECT Select.cpp -lncurses для его компиляции, но постоянно получаю ту же ошибку:

/tmp/ccirp2Pk.o: En la función `main':
Select.cpp:(.text+0x10e): referencia a `std::allocator<char>::allocator()' sin definir
Select.cpp:(.text+0x127): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' sin definir
Select.cpp:(.text+0x136): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x14d): referencia a `std::allocator<char>::allocator()' sin definir
Select.cpp:(.text+0x166): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' sin definir
Select.cpp:(.text+0x175): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x18c): referencia a `std::allocator<char>::allocator()' sin definir
Select.cpp:(.text+0x1a5): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)' sin definir
Select.cpp:(.text+0x1b4): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x217): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::c_str() const' sin definir
Select.cpp:(.text+0x2cb): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x2df): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x2f3): referencia a `std::allocator<char>::~allocator()' sin definir
Select.cpp:(.text+0x319): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' sin definir
Select.cpp:(.text+0x34c): referencia a `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()' sin definir
/tmp/ccirp2Pk.o:(.data.rel.local.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): referencia a `__gxx_personality_v0' sin definir
collect2: error: ld returned 1 exit status

Я понял, что проблема всякий раз, когда я использую строку, хотя я включил <string> в начале.

Код, с которым я работаю:

#include <ncurses.h>
using namespace std;
#include <string>

int main(int argc, char ** argv){
    //Ncurses Starts
    initscr();
    noecho();
    cbreak();

    //get screen size
    int yMax, xMax;
    getmaxyx(stdscr,yMax, xMax);

    //create a window for our menu
    WINDOW * menuwin = newwin(6, xMax-12, yMax-8, 5);
    box(menuwin, 0, 0);
    refresh();
    wrefresh(menuwin);

    //makes it so we can use arrow keys
    keypad(menuwin, TRUE);
    string choices[3] = {"walk", "jog", "run"};
    int choice;
    int highlight =0;

    while(1){
      for(int i=0;i<3;i++){
        if(i == highlight){
            wattron(menuwin, A_REVERSE);
            mvwprintw(menuwin, i+1, 1, choices[i].c_str());
            wattroff(menuwin, A_REVERSE);
        }
        choice = wgetch(menuwin);

        switch(choice){
            case KEY_UP:
                highlight--;
                break;
            case KEY_DOWN:
                highlight++;
                break;
            default:
                break;
        }
        if(choice=10){
            break;
        }
      }
    }


    //make sure program waits before exiting
    getch();
    endwin();
    //Ncurses ends

    return 0;
}

Спасибо за готовность и если вы можете помочь я был бы признателен.

1 Ответ

1 голос
/ 13 февраля 2020

Первый шаг при обращении за помощью на любом форуме, а не только к stackoverflow, состоит в том, чтобы уменьшить вашу проблему до минимальных шагов, необходимых для ее воспроизведения. В вашем случае вы предоставили слишком много кода и слишком мало информации о предпринятых вами шагах. Это было бы лучше:


(пример вопроса) Я пытаюсь собрать программу с использованием ncurses и c ++ std :: string. Это мой код

    #include <ncurses.h>
    #include <string>
    int main()
    {
      std::string s;
      initscr();
      endwin();
      return 0;
    }

Я использую Ubuntu 18.04, с g cc версия 9.0.1 Это моя команда сборки

gcc main.cpp

, которая не удается (усеченные ошибки для краткости)

/tmp/ccJyXNFX.o: In function `main':
main.cpp:(.text+0x2d): undefined reference to `initscr'
...
main.cpp:(.text+0x10e): undefined reference to `std::allocator<char>::allocator()'
main.cpp:(.text+0x127): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
...
undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status

В ваших комментариях предлагается использовать вместо меня g ++. Но это также не помогает

g++ main.cpp

/tmp/ccWWu0ZW.o: In function `main':
main.cpp:(.text+0x2d): undefined reference to `initscr'
...

На данный момент мы были бы лучше готовы помочь вам. Я хотел бы отметить, что вам нужно связать библиотеки ncurses на этапе сборки следующим образом:

g++ main.cpp -lcurses

И это будет работать. Пожалуйста, учтите, что когда вы говорите «это не работает», мы почти не понимаем, о чем вы говорите. Дайте сообщения об ошибках, укажите c и покажите, что именно вы пробовали. Возможно, у вас была эта ошибка:

main.cpp:1:10: fatal error: ncurses.h: No such file or directory
    1 | #include <ncurses.h>

В этом случае мы бы сказали вам установить pkg для разработки ncurses для вашего дистрибутива (для меня в Ubuntu это будет apt-get install libncurses5-dev). Но без подробностей мы, вероятно, проигнорируем ваш вопрос или сделаем бесполезные предположения.

...