О боже, я могу быть очень тупым, но я не могу понять, как я должен правильно связать <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, но я не нашел примеров и понятия не имею. Любая помощь может быть отличной
Также код C++ должен быть скомпилирован с использованием g++, а не gcc.
я пробовал все это и с g++ тоже, команды выполняются без ошибок, но я получаю ту же ошибку при компиляции программы
Вы должны использовать использовать g++ lab8.cpp -lpanel -lncurses. Пожалуйста, публикуйте только вывод этой команды. Удалите вывод всех других команд, они неверны и их вывод ничуть не интересен и вводит в заблуждение тех, кто пытается вам помочь.
проверьте еще раз, эта команда выполнена успешно, но я получаю ту же ошибку, что и при запуске программы
«Эта команда выполняется успешно, но я получаю ту же ошибку, которую я опубликовал при запуске программы» Нет, этого не может произойти. Эти ошибки выдаются компилятором, а не вашей программой. Вы неправильно интерпретируете то, что происходит на самом деле. Скорее всего у вас не работает программа. Вам нужно запустить его, используя ./a.out.





Всегда полезно ознакомиться с документацией. Глядя на раздел 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», на которые ссылается: ...» и далее
У меня отлично работает в WSL при компиляции кода базовых панелей в документации. Происходит что-то, что специфично для Mac/варева.
@fvllenleaves Посмотрите, решает ли обновление вашу проблему.
Спасибо за обновление, я почти уверен, что запускал эту команду раньше. Я должен запускать команду clang++ каждый раз при запуске программы вместо стандартного F5? Я запускаю его без ошибок, но я не получаю никакого вывода.
@fvllenleaves Пожалуйста, смотрите мое последнее обновление. Это касается того факта, что ваш код теперь является проблемой. Что касается этих команд, «почти уверен» бессмысленно.
@fvllenleaves Вы не настроили свой VSCode для запуска нужных вам команд и не знаете, какие команды вам нужны. Решайте одну проблему за раз. Выключите VSCode, откройте терминал и работайте оттуда. Как только вы поймете, как скомпилировать и запустить вашу программу, вернитесь в VSCode и выясните, как заставить ее скомпилировать и запустить вашу программу для вас, используя команды, которые вы выяснили на предыдущем этапе. VSCode не очень умен и не будет делать то, что вы хотите, пока вы не объясните это в точности, а чтобы объяснить ему, что делать, нужно знать, что делать.
Извините, если я не понял, я, конечно, снова запустил команды. Я был немного смущен запуском программы, большое спасибо за вашу помощь. Я просто не понимал, что мне нужно было вручную скомпилировать, а затем запустить "a.out". Теперь я буду работать над кодом.
Вы не пробовали
gcc lab8.cpp -lncurses -lpanel?