Как связать PDCurses с помощью gcc в Windows?

Недавно я установил PDCurses 3.6 (последняя версия) на свой ноутбук HP Pavilion с Windows 7 Home Premium. Также я установил MinGW-w64 (тоже последняя версия).

Итак, я начал изучать, как использовать режим curses здесь, и загрузил их примеры кодов (ncurses_programs.tar.gz); в этот момент все было в порядке. После распаковки программ я хотел использовать Makefile, чтобы все файлы .exes были уже созданы. Вот в чем проблема.

Я запустил cmd.exe, переместил в папку с программами и набрал mingw32-make -f Makefile. Это следующий процесс:

mingw32-make[1]: Entering directory 'C:/.../ncurses_programs/JustForFun'
gcc -o hanoi.o -c hanoi.c

/* throws some warnings */

gcc -o ../demo/exe/hanoi hanoi.o -lncurses
C:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64w64-mingw32/bin/ld.exe: cannot find -lncurses
collect2.exe: error: ld returned 1 exit status
mingw32-make[1]: *** [Makefile:20: ../demo/exe/hanoi] Error 1
rm hanoi.o
mingw32-make[1]: Leaving directory 'C:/.../ncurses_programs/JustForFun'
mingw32-make: *** [Makefile:4: all] Error 2

Ну, вы наверняка думаете: «Чувак, он пытается связать ncurses, а у вас есть pdcurses, потому что вы работаете в Windows». Да, я знаю его. Вот почему я отредактировал Makefile, набрав LIBS=-lpdcurses вместо LIBS=-lncurses, но он тоже не нашел.

Я знаю, где находится pdcurses.a, поэтому я попытался скомпилировать простую программу (выведите «Hello World!») С помощью консоли, например:

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

Я все еще получаю:

C:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lpdcurses
collect2.exe: error: ld returned 1 exit status

Не знаю, что еще я могу сделать ...

Заранее спасибо!


person Amadeo García Torrano    schedule 08.09.2018    source источник


Ответы (1)


Связывание -lname gcc передается компоновщику ld. Он инструктирует компоновщик искать любой из файлов libname.so (общая библиотека) или libname.a (статическая библиотека), сначала в указанных каталогах поиска компоновщика (-Ldir) в их указанном порядке, а затем в каталогах поиска по умолчанию в их настроенный заказ. Когда любой из этих файлов найден в одном из каталогов поиска, компоновщик прекращает поиск и вводит библиотеку для связывания. Если он находит их обоих в одном каталоге, то по умолчанию он выбирает libname.so.

В портах GCC для Windows name.lib (статическая библиотека) и name.dll (динамическая библиотека), вероятно, также будет удовлетворять параметру -lname.

Учитывая, что у вас есть статическая библиотека PDCurses pdcurses.a, установленная в -LC:\PDCurses\wincon, компоновка:

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

не работает с:

cannot find -lpdcurses

потому что в C:\PDCurses\wincon нет файла с именем libpdcurses.a, libpdcurses.so, pdcurses.lib или pdcurses.dll.

Переименование pdcurses.a в libpdcurses.a в этом каталоге исправит эту ошибку. Если вы не хотите его переименовывать, вы можете заменить параметр связывания -lpdcurses на -l:pdcurses.a. Параметр -l:name указывает компоновщику искать файл с именем name.

Однако вам все равно не удастся связать свою тестовую программу с:

gcc -LC:\PDCurses\wincon -lpdcurses -o myprogram myprogram.c

or:

gcc -LC:\PDCurses\wincon -l:pdcurses.a -o myprogram myprogram.c

Связь завершится ошибкой с неопределенными ссылками на любые pdcurses символы (функции или переменные), на которые вы ссылаетесь в myprogram.c. (Если вы на самом деле не ссылаетесь на какие-либо такие символы в myprogram.c, тогда он не потерпит неудачу, но только потому, что библиотека избыточна).

Чтобы исправить эту ошибку (которая может не повлиять на ваш make-файл, который мы не видим), вместо этого запустите:

gcc -o myprogram myprogram.c -LC:\PDCurses\wincon -lpdcurses

или аналогично, если вы выберете -l:pdcurses.a.

Чтобы понять это, см. Ваша связь потребляет библиотеки перед объектными файлами, которые на них ссылаются

person Mike Kinghan    schedule 08.09.2018
comment
Вы также можете просто сделать gcc -o myprogram myprogram.c C:\PDcurses\wincon\pdcurses.a. - person William McBrine; 09.09.2018