Как подключить библиотеку ncurses к проекту на Qt Creator ?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.84] |
|
|
Правила раздела *nix / gcc / Eclipse / Qt / wxWidgets / GTK+
| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Как подключить библиотеку ncurses к проекту на Qt Creator ?
|
Сообщ.
#1
,
|
|
|
|
Я создал проект на Qt Creator 4.12.2 под именем NcursesTest в операционной системе Windows 10, в котором используется библиотека ncurses для работы с консольным окном.
Библиотеку ncurses я установил на мой компьютер с помощью программы MSYS2. После установки MSYS2 я вызвал MSYS MING32, в окне я ввёл команду Цитата $ pacman –Suy для обновления репозитория, затем я закрыл это окно с помощью команды exit, затем я снова вызвал MSYS MING32, в окне которого я ввёл Цитата $ pacman –Ss ncurses Для установки библиотеки ncurses. После этого я то же самое сделал с MSYS MING64 – сперва ввёл в его окне Цитата $ pacman –Suy А затем, после закрытия этого окна с помощью команды exit, я заново вызвал MSYS MINGW64 и ввёл в его окне команду Цитата $ pacman –Ss ncurses В результате чего библиотека ncurses была установлена на мой компьютер. Файл mainwindow.cpp моего проекта: ![]() ![]() #include “mainwindow.h” #include “ui_mainwindow.h” #include “ncurses.h” MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), Ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() // если была нажата кнопка “Выход” { close(); } void MainWindow::on_pushButton_2_clicked() // если была нажата кнопка “Тестировать” { initscr(); printw(“Hello world!\n”); refresh(); getch(); endwin(); } В результате при компиляции проекта появляются сообщения об ошибках: Цитата undefined reference to ‘initstr’ undefined reference to ‘printw’ undefined reference to ‘refresh’ undefined reference to ‘stdscr’ undefined reference to ‘wgetch’ undefined reference to ‘endwin’ Файл NcursesTest.pro выглядит следующим образом: Цитата QT += core gui greaterThan(QT_MAJOR_VERSION,4): QT+=widgets CONFIG += c++11 DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp mainwindow.cpp HEADERS += \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/curses.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesapp.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesf.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesm.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesp.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesw.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursslk.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/eti.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/etip.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/form.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/menu.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/nc_tparm.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_dll.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_mingw.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/panel.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term_entry.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/termcap.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/tic.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/unctrl.h \ mainwindow.h FORMS += \ mainwindow.ui INCLUDEPATH += /path/to/ncurses/headers INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw LIBS ++ -L/path/to/ncurses/library/-lncursesw qnx: target.path = /tmpl/$${TARGET}/bin else: unix:!android:target.path=/opt/$${TARGET}/bin !isEmpty(target.path):INSTALLS+=target Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw else:unix: LIBS += -LC:/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw Как сделать так, чтобы у меня произошло правильное подключение библиотеки ncurses в мой проект? Как сделать так, чтобы моя программа нормально скомпилировалась и запустилась? |
|
Сообщ.
#2
,
|
|
|
|
может
LIBS += -L/path/to/ncurses/library/-lncursesw и совет- не используйте формы |
|
Сообщ.
#3
,
|
|
|
|
и вот это
INCLUDEPATH += /path/to/ncurses/headers |
|
Сообщ.
#4
,
|
|
|
|
Чета я теряю нить разрабатываемого!
Для консоли - нужно использовать проект для консольного приложения, при чет тут GUI? |
|
Сообщ.
#5
,
|
|
|
|
В общем показываю работающие варианты ...
1) Работает, но я бы так не делал NcursesTest.pro ![]() ![]() QT -= gui CONFIG += c++17 console CONFIG -= app_bundle SOURCES += \ main.cpp LIBS += -L$$PWD/../../../../mingw32/lib/ -lncursesw INCLUDEPATH += $$PWD/../../../../mingw32/include DEPENDPATH += $$PWD/../../../../mingw32/include 2) Это ИМХО правильный вариант (с использованием pkg-config) NcursesTest.pro ![]() ![]() QT -= gui CONFIG += c++17 console CONFIG -= app_bundle CONFIG += link_pkgconfig PKGCONFIG += ncursesw SOURCES += \ main.cpp Это сам main.cpp: ![]() ![]() #include <QCoreApplication> #include <QtCore> #include <ncurses/ncurses.h> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); initscr(); printw("Hello world!\n"); refresh(); getch(); endwin(); QTimer::singleShot(0, &app, &QCoreApplication::quit); return app.exec(); } Код очень упрощен! Чтобы задействовать сигналы и слоты Qt - нужно логику выносить из main. И еще - не забыть в проекте QtCreator поставить галочку "Запускать в терминале": |
|
Сообщ.
#6
,
|
|
|
|
Цитата Majestio @ Чета я теряю нить разрабатываемого! Для консоли - нужно использовать проект для консольного приложения, при чет тут GUI?Просто я создал тестовое диалоговое оконное приложение NcursesTest для того, чтобы проверить, как у меня из него запускается консольное окно после нажатия на одну из кнопок окна приложения. |
|
Сообщ.
#7
,
|
|
|
|
Нельзя так делать - либо консольное приложение, либо GUI. Это по фэн-шую, а остальное - от демонов!
|
|
Сообщ.
#8
,
|
|
|
|
В Linux все приложения консольные, а графический интерфейс это только дополнение. При этом консоль у приложения может быть скрыта.
В Windows вы можете просто открыть консоль с помощью WinAPI (AllocConsole / GetStdHandle / FreeConsole). Настройки же компилятора в Linux заставляют отладчик отобразить консоль для отладки приложения. В Windows эта настройка добавляют флаг в PE файл для загрузчика о необходимости создания консоли до запуска приложения. Сама библиотека ncurses реализует только взаимодействие со стандартной системной консолью. Т.е. вся работа, которую делает ncurses, это только ввод/вывод данных из/в консоли (ещё управление цветом текста в консоли и перемещение курсора). |
|
Сообщ.
#9
,
|
|
|
|
Я изменил файл NcursesTest.pro:
Цитата QT += core gui greaterThan(QT_MAJOR_VERSION,4): QT+=widgets CONFIG += c++11 CONFIG += link_pkgconfig CONFIG += ncursesw DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp mainwindow.cpp HEADERS += \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/curses.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesapp.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesf.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesm.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesp.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursesw.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/cursslk.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/eti.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/etip.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/form.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/menu.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/nc_tparm.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_dll.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/ncurses_mingw.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/panel.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/term_entry.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/termcap.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/tic.h \ C:/Qt/Qt5.12.9/Tools/mingw730_32/ opt/include/ncursesw/unctrl.h \ mainwindow.h FORMS += \ mainwindow.ui INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw INCLUDEPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include INCLUDEPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses.a LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncursesw.a LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses++w.a LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncurses++w_g.a LIBS += -L$$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/libncursesw_g.a qnx: target.path = /tmpl/$${TARGET}/bin else: unix:!android:target.path=/opt/$${TARGET}/bin !isEmpty(target.path):INSTALLS+=target Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses.a Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw.a Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w.a Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncurses+w_g.a Win32:CONFIG(release, debug|release): LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a else:win32:CONFIG(debug, debug|release): LIBS += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a else:unix: LIBS +=-LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib/lncursesw_g.a DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw DEPENDPATH += $$PWD/C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib В файле mainwindow.cpp я написал: ![]() ![]() #include "C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw/ncurses.h" В результате чего заголовочный файл ncurses.h стал видеться из моего проекта (так как если написать #include "ncurses.h" или #include "ncursesw/ncurses.h" , то файл ncurses.h почему-то не видится из моего проекта). Но при компиляции программы выдаются ошибки: Цитата undefined reference to 'initscr' undefined reference to 'printw' undefined reference to 'refresh' undefined reference to 'stdscr' undefined reference to 'wgetch' undefined reference to 'endwin' Такое ощущение, что компилятор не видит библиотечные файлы libncurses.a, libncursesw.a, libncurses+w.a, libncurses+w_g.a, libncursesw_g.a . Как исправить эту ошибку, как сделать так, чтобы компилятор увидел библиотечные файлы библиотеки ncurses? |
|
Сообщ.
#10
,
|
|
|
|
Когда используется pkg-config, он сам настраивает все заголовки и либы.
И всю эту дополнительную "муть" из файла проекта нужно удалить. Я же приводил пример работающего файла проекта. Он достаточен сам по себе - не нужно ничего дополнять более! ![]() ![]() QT -= gui CONFIG += c++17 console CONFIG -= app_bundle CONFIG += link_pkgconfig PKGCONFIG += ncursesw SOURCES += \ main.cpp Это все - больше ничего не нужно! PS. Ну если только сделать GUI приложение. Но повторюсь - делать GUI, при этом в консоли использовать ncurses, я считаю извратом. |
|
Сообщ.
#11
,
|
|
|
|
Цитата PS. Ну если только сделать GUI приложение. Но повторюсь - делать GUI, при этом в консоли использовать ncurses, я считаю извратом. Ну вот у меня GUI-шное приложение (не программа NcursesTest, а та настоящая программа, которую я делаю). Как мне организовать в этом GUI-шном приложении консольный ввод-вывод? |
|
Сообщ.
#12
,
|
|
|
|
Наверное в конструкторе главного окна приложения инициализировать ncurses, а в деструкторе его остановить. Свят-свят-свят
|
|
Сообщ.
#13
,
|
|
|
|
сразу в майне
|
|
Сообщ.
#14
,
|
|
|
|
Я убрал linkpkg_config и PKGCONFIG.
Я сделал изменения в файле NcursesTest.pro и mainwindow.cpp . В результате у меня получилось: 1) файл NcursesTest.pro: Цитата QT += core gui greater than(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 DEFINES += QT_DEPRECATED_WARNINGS SOURCES += \ main.cpp mainwindow.cpp HEADERS += \ mainwindow.h INCLUDEPATH += LC:\Qt\Qt5.12.9\Tools\mingw730_64\opt\bin FORMS += \ mainwindow.ui unix|win32: LIB += -LC:/Qt/Qt5.12.9/Tools/mingw730_32/opt/lib -lncurses INCLUDEPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw DEPENDPATH += C:/Qt/Qt5.12.9/Tools/mingw730_32/opt/include/ncursesw 2) файл mainwindow.cpp: ![]() ![]() #include "mainwindow.h" #include "ui_mainwindow.h" #include "ncurses.h" MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupui(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_pushButton_clicked() // если была нажата кнопка "Выход" { close(); } void MainWindow::on_pushButton_2_clicked() // если была нажата кнопка "Тестировать" { initscr(); printw("Hello world!\n"); refresh(); getch(); endwin(); } В результате чего у меня программа компилируется, запускается. При нажатии на кнопку "Тестировать" у меня появляется консольное окно, на котором отображена надпись Hello world! и переход на следующую строку. Но только почему-то при нажатии какой-либо клавиши у меня это консольное окно не закрывается. Как сделать так, чтобы это консольное окно закрывалось? |
|
Сообщ.
#15
,
|
|
|
|
И ещё вопрос. Я добавил код в функцию void MainWindow::on_pushButton_2_clicked() :
![]() ![]() void MainWindow::on_pushButton_2_clicked() // если была нажата кнопка "Тестировать" { initscr(); printw("Hello world!\n"); refresh(); printw("Enter first real number: "); refresh(); scanw("%lf",&val1); printw("Enter first real number: "); refresh(); scanw("%lf",&val2); val3 = val1 + val2; printw("Sum of two input values is: %f\n",val3); refresh(); getch(); endwin(); } В результате чего в консольном окне у меня выводится: Цитата Hello world! Enter first real number: Enter second real number: Sum of two input numbers is: -2.000000 То есть ввод значений не осуществляется. Как сделать так, чтобы в консольном окне осуществлялся ввод значений? |