как использовать ncurses.h на i686-w64-mingw32-g++

Я скачал ncurses с помощью этой команды:

sudo apt install libncurses-dev

А компилирую с помощью строки:

i686-w64-mingw32-g++ -Wall -g client.cpp -o client -static-libstdc++ -static-libgcc -lncurses -DNCURSES_STATIC -lncursesw

Мне выдает ошибку fatal error: ncurses.h: No such file or directory. Мне нужно обязательно использовать и mingw, и ncurses. Есть у кого-то идеи, как это сделать?


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

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

Библиотеки компилируются для какой-то одной платформы за раз. Ваш sudo apt install libncurses-dev ставит ncurses, собранный для линукса, а не для винды/MinGW.

Его нужно скомпилировать через MinGW самому, или найти уже скомпилированный.

В комментариях дают вредные советы вручную указать путь до линуксовой библиотеки через -I - это не поможет. Допустим, хедеры таким образом найдутся, но линковка с библиотекой все равно не пройдет (даже если путь до библиотеки указать в -L - см. первый абзац).


Если дело происходит на Windows в WSL или другой виртуальной машине, то проще всего вместо этого поставить компилятор напрямую на винду. Кросс-компиляция всегда сложнее нативной. Либо поставить MSYS2, и поставить ncurses из их пакетного менеджера (тогда ощущения будут как на линуксе), либо поставить Visual Studio и поставить ncurses из vcpkg.


Пользуясь случаем, рекомендую свой quasi-msys2, который дает доступ к большому количеству уже скомпилированных библиотек для MinGW, взятых из MSYS2 (который сам по себе работает только винде).

  • Ставим зависимости:

    sudo apt install make wget tar zstd gawk gpg gpgv wine
    # И свежий кланг: (либо взять более старый из стандартных репозиториев)
    bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)".
    
  • Ставим сам quasi-msys2, и в нем ncurses:

    git clone https://github.com/HolyBlackCat/quasi-msys2
    cd quasi-msys2
    make install _gcc _ncurses
    env/shell.sh
    
  • Пробуем собрать первый попавшийся пример:

    #include <ncurses.h>
    
    int main()
    {
        initscr();
        printw("Hello, world!");
        refresh();
        getch();
        endwin();
    }
    
    win-clang++ 1.cpp -static `pkg-config --libs --cflags --static ncursesw`
    

    Как цивилизованные люди, узнаем правильные флаги из pkg-config.


Еще, если с ncurses что-то не получится, советую посмотреть в сторону pdcurses (который тоже есть в пакетах MSYS2 и quasi-msys2).

→ Ссылка