Правильная настройка NCurses (curses.h) на VSCode Mac

О боже, я могу быть очень тупым, но я не могу понять, как я должен правильно связать <curses.h> с моим файлом. Я много искал, но, похоже, не нашел информации, которая помогла бы. Вот мой код, действительно простой:

#include <iostream>
#include <curses.h>
#include <panel.h>
using namespace std;

int main()
{

    initscr();

    WINDOW *p = newwin(0, 0, LINES / 2, COLS / 2);
    PANEL *p_panel = new_panel(p);
    waddstr(p, "that's what i'm talking about!");

    update_panels(); 
    doupdate(); 
    endwin();
    return 0;
}

Я установил библиотеку ncurses с помощью brew через терминал, и у меня есть обновленная версия clang. Я пытаюсь запустить приложение в терминале VSCode. Вот ошибка, которую я получаю:

Undefined symbols for architecture x86_64:
  "_COLS", referenced from:
      _main in lab8-80f309.o
  "_LINES", referenced from:
      _main in lab8-80f309.o
  "_doupdate", referenced from:
      _main in lab8-80f309.o
  "_endwin", referenced from:
      _main in lab8-80f309.o
  "_initscr", referenced from:
      _main in lab8-80f309.o
  "_new_panel", referenced from:
      _main in lab8-80f309.o
  "_newwin", referenced from:
      _main in lab8-80f309.o
  "_update_panels", referenced from:
      _main in lab8-80f309.o
  "_waddnstr", referenced from:
      _main in lab8-80f309.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я попытался связать его вручную с помощью gcc, я использовал эту команду: clang++ lab8.cpp -lpanel -lncurses и то же самое с g++. Он выполнен успешно, файл "a.out" был создан, но без разницы Я также где-то видел, что мне может понадобиться связать эту библиотеку в tasks.json, но я не нашел примеров и понятия не имею. Любая помощь может быть отличной

Вы не пробовали gcc lab8.cpp -lncurses -lpanel?

molbdnilo 03.04.2023 12:06

Также код C++ должен быть скомпилирован с использованием g++, а не gcc.

πάντα ῥεῖ 03.04.2023 12:11

я пробовал все это и с g++ тоже, команды выполняются без ошибок, но я получаю ту же ошибку при компиляции программы

fvllen leaves 03.04.2023 12:20

Вы должны использовать использовать g++ lab8.cpp -lpanel -lncurses. Пожалуйста, публикуйте только вывод этой команды. Удалите вывод всех других команд, они неверны и их вывод ничуть не интересен и вводит в заблуждение тех, кто пытается вам помочь.

n. m. 03.04.2023 12:37

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

fvllen leaves 03.04.2023 12:42

«Эта команда выполняется успешно, но я получаю ту же ошибку, которую я опубликовал при запуске программы» Нет, этого не может произойти. Эти ошибки выдаются компилятором, а не вашей программой. Вы неправильно интерпретируете то, что происходит на самом деле. Скорее всего у вас не работает программа. Вам нужно запустить его, используя ./a.out.

n. m. 03.04.2023 12:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Всегда полезно ознакомиться с документацией. Глядя на раздел 2.1, видно, что -lncurses требуется для очень простой программы ncurses, но там ничего не было о панелях. Прокрутка оглавления вниз для поиска панелей приводит к разделу 16.2, где ясно показано, что требуется -lpanel -lncurses.

gcc и g++ по умолчанию являются просто псевдонимами LLVM на Mac. clang++ lab8.cpp -lpanel -lncurses должно отлично сработать.

С Mac и установленным пивом ncurses, это снова помогает прочитать документацию. В этом случае вам просто необходимо brew info ncurses. В нем четко сказано:

For compilers to find ncurses you may need to set:
  set -gx LDFLAGS "-L/usr/local/opt/ncurses/lib"
  set -gx CPPFLAGS "-I/usr/local/opt/ncurses/include"

Выполнение этих команд должно позволить вам скомпилировать ваш ncurses. И наоборот, строки в кавычках могут быть добавлены к вашей команде компиляции.

clang++ lab8.cpp "-I/usr/local/opt/ncurses/include" "-L/usr/local/opt/ncurses/lib" -lpanel -lncurses

Приведенная выше команда была протестирована с использованием кода базовой панели из приведенной выше ссылки на документацию, и она работает на моем MacBook Pro с использованием ncurses, установленных из brew.

Здесь я также рекомендую систему сборки, чтобы автоматизировать это для вас. В зависимости от того, насколько тривиальна ваша программа, может быть достаточно самодельного make-файла, но сейчас самое время изучить cmake.


Стоит отметить, что ваш код ничего не сделает. Делает панель, после чего программа сразу завершается. Все, что вы нарисовали, не останется на экране.

Опять же, ссылка на документацию показывает, что строка getch(); перед endwin(); «замораживает» программу, чтобы вы могли видеть свой текст. Нажатие любой клавиши должно завершить вашу программу.

Я должен отметить, что я сделал еще одно изменение в вашем примере кода, которое может или не может относиться к вашему проекту в целом. Если вы включаете panel.h, вам не нужно включать ncurses.h, и вам никогда не требовалось iostream в примере. Так что у меня было только #include <panel.h>.

Это не сработало :( Получение той же ошибки, которую я опубликовал: «Неопределенные символы для архитектуры x86_64: «_COLS», на которые ссылается: ...» и далее

fvllen leaves 03.04.2023 12:22

У меня отлично работает в WSL при компиляции кода базовых панелей в документации. Происходит что-то, что специфично для Mac/варева.

sweenish 03.04.2023 12:33

@fvllenleaves Посмотрите, решает ли обновление вашу проблему.

sweenish 03.04.2023 12:40

Спасибо за обновление, я почти уверен, что запускал эту команду раньше. Я должен запускать команду clang++ каждый раз при запуске программы вместо стандартного F5? Я запускаю его без ошибок, но я не получаю никакого вывода.

fvllen leaves 03.04.2023 12:50

@fvllenleaves Пожалуйста, смотрите мое последнее обновление. Это касается того факта, что ваш код теперь является проблемой. Что касается этих команд, «почти уверен» бессмысленно.

sweenish 03.04.2023 12:54

@fvllenleaves Вы не настроили свой VSCode для запуска нужных вам команд и не знаете, какие команды вам нужны. Решайте одну проблему за раз. Выключите VSCode, откройте терминал и работайте оттуда. Как только вы поймете, как скомпилировать и запустить вашу программу, вернитесь в VSCode и выясните, как заставить ее скомпилировать и запустить вашу программу для вас, используя команды, которые вы выяснили на предыдущем этапе. VSCode не очень умен и не будет делать то, что вы хотите, пока вы не объясните это в точности, а чтобы объяснить ему, что делать, нужно знать, что делать.

n. m. 03.04.2023 13:42

Извините, если я не понял, я, конечно, снова запустил команды. Я был немного смущен запуском программы, большое спасибо за вашу помощь. Я просто не понимал, что мне нужно было вручную скомпилировать, а затем запустить "a.out". Теперь я буду работать над кодом.

fvllen leaves 03.04.2023 13:46

Другие вопросы по теме