Как подключить curses-подобную библиотеку?

Платформа Windows 10. Хочу поработать с curses-подобной библиотекой, но возникли проблемы. Не получается их подключить.

Через MinGW установил GCC, make, ncurses, pdcurses, gdb.

Пытаюсь сначала работать через Visual Studio, устанавливаю библиотеки из NuGet, но как подключить её не пойму

#include <ncurses.h>

Строка подчеркивается красным курсивом. Соответственно она не подключена.

Если я работаю с VS Code, то строка также красная. Указал путь в c/c++ расширении до компилятора, стандартные библиотеки заработали, curses нет.

Пытался через msys2, тоже не получается.

1.Как подключить curses-подобные библиотеки? Желательно через gcc, а не компилятор VC++(если он так правильно называется)

2.Есть ли способ поменять компилятор в Visual Studio, или он залочен на VC++?(менее важный)

Спасибо.


Ответы (1 шт):

Автор решения: HolyBlackCat

Не смешивайте MinGW и VS, библиотеки от одного чаще всего не совместимы с другим.


Пытался через msys2

Для начала, прочитайте What are MSYS2 environments? How do I pick one?. Я буду использовать UCRT64, но для других должно быть аналогично.

Ищем библиотеку: pacman -Ss curses

Видим:

mingw-w64-ucrt-x86_64-curses
mingw-w64-ucrt-x86_64-ncurses
mingw-w64-ucrt-x86_64-pdcurses

Гуглеж подсказывает, что в MSYS2 первое - синоним третьего (смотрим в "provides"), и что третье - лучше чем второе.

Ставим: pacman -S mingw-w64-ucrt-x86_64-pdcurses.

Теперь пробуем собрать hello world.

#include <pdcurses.h>

int main(int argc, char *argv[])
{
    initscr();
    printw("Hello World !!!");
    refresh();
    getch();
    endwin();

    return 0;
}

Смотрим список файлов в пакете. Там нет .pc-файла, поэтому не получится использовать pkgconf, чтобы автоматически, не думая, получить правильные флаги компилятора.

Видим несколько .a-файлов, из которых нужно выбрать. (А вот и мануал.) Пробуем каждый:

  • g++ 1.cpp -lpdcurses - открывает свое окно, которое выглядит как простенькая консоль
  • g++ 1.cpp -lpdcurses_vt - пытается что-то печатать в обычную консоль, но у меня в wine нормально не заработал.
  • g++ 1.cpp -lpdcurses_wincon -lwinmm - печатает в консоль (откуда взялся -lwinmm - сначала пробуем без него, видим ошибку undefined reference to PlaySoundW - открываем мануал - там видим Library - Winmm.lib - подставляем -lwinmm, ошибка пропадает)
  • g++ 1.cpp -lpdcurses_wingui -lgdi32 -lwinmm -lcomdlg32 - аналогично первому (флаги подбирал как в предыдущем пункте)

В итоге, wincon выглядит лучше всего.


Если захотите сделать то же самое на Visual Studio, я бы использовал vcpkg. (Теоретически vcpkg и с MinGW кое-как работает, но привязываться к нему выглядит странно - все-таки он больше для VS, MinGW там для галочки, насколько я понимаю.)

Есть еще Conan, который должен работать и с MinGW, и с VS.

NuGet - это какой-то странный зверь, я не видел, чтобы им пользовались для С++.


2.Есть ли способ поменять компилятор в Visual Studio, или он залочен на VC++?

Там можно легко можно поставить Clang (в режиме совместимости с MSVC (то что вы называете "VC++")).

Способ поставить другие-то может и есть, но зачем? Если не используете MSVC, то я бы не привязывался с продуктам MS (по крайней мере не-кроссплатформенным и не-опенсурсным). Я бы посоветовал VSCode (с Clangd вместо дефолтного C++-плагина - во-первых опенсорс, во-вторых работает лучше). Потом будет легче мигрировать на другую ОС, и опенсорс не превратится неожиданно в тыкву от санкций и прочего.

→ Ссылка