如何在Windows上使用gcc链接PDCurses?

时间:2018-09-08 00:15:38

标签: windows linker mingw pdcurses

最近,我在装有Windows 7 Home Premium的HP Pavilion笔记本电脑上安装了PDCurses 3.6(最新版本)。另外,我还安装了MinGW-w64(也是最新版本)。

好吧,我开始学习如何使用curses模式here,并下载了他们的示例代码(ncurses_programs.tar.gz);此时一切都还可以。 解压缩程序后,我想利用Makefile来制作所有.exe文件。 这是问题所在。

我运行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

我不知道还能做什么...

先谢谢您!

1 个答案:

答案 0 :(得分:1)

-lname的{​​{1}}链接被传递到链接器gcc。它 指示链接器搜索文件ld(共享库)中的任何一个 或libname.so(静态库),首先在指定的链接器搜索目录中 ({libname.a),按照其指定顺序,然后是其默认搜索目录, 按照其配置顺序。在其中一个搜索中找到这些文件中的任何一个时 链接程序停止搜索的目录,并将库输入到链接。如果它 在同一个目录中找到这两个文件,然后默认选择-Ldir

在GCC的Windows端口上,libname.so(静态库)和name.lib(动态库) 可能还会满足name.dll选项。

鉴于您已在其中安装了PDCurses静态库-lname pdcurses.a,关联:

-LC:\PDCurses\wincon

失败:

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

因为没有名为cannot find -lpdcurses libpdcurses.alibpdcurses.sopdcurses.lib中存在pdcurses.dll

在该目录中将C:\PDCurses\wincon重命名为pdcurses.a将解决此故障。 如果您不想重命名,则可以替换链接选项libpdcurses.a-lpdcurses。选项-l:pdcurses.a指示链接器搜索 精确地称为-l:name的文件。

但是,您仍然无法将测试程序与 要么:

name

或:

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

由于对任何gcc -LC:\PDCurses\wincon -l:pdcurses.a -o myprogram myprogram.c 符号的未定义引用错误,链接将失败 您在pdcurses中引用的(函数或变量)。 (如果您实际上没有在myprogram.c中引用任何此类符号,则它不会失败,而仅仅是因为库是多余的。)

要更正此错误(该错误可能不会影响您的Makefile,我们看不到), 而是运行:

myprogram.c

或相似性(如果您选择gcc -o myprogram myprogram.c -LC:\PDCurses\wincon -lpdcurses

要了解这一点,请参见Your linkage consumes libraries before the object files that refer to them