含.c与.s文件的ncurses程序Makefile编译链接错误求助
问题分析与修复方案
你遇到的这个undefined reference错误,核心原因是把链接ncurses库的参数放错阶段了——编译和链接是两个完全不同的步骤,库链接操作应该放在最终生成可执行文件的环节,而不是编译单个目标文件的时候。
你的Makefile问题点
在service.o的编译命令里,你加了-lncurses,但这个命令用了-c参数(代表只编译不链接),所以这个链接库的参数在编译阶段完全不起作用。等到最后链接生成test_reservation的时候,没有告诉编译器要链接ncurses库,自然找不到initscr这些ncurses的函数实现。
修改后的正确Makefile
test_reservation: reservation.o service.o gcc -g -m32 service.o reservation.o -o test_reservation -lncurses service.o: service.c gcc -g -m32 -c -o service.o service.c -std=c99 reservation.o: reservation.s as -gdbb --32 -o reservation.o reservation.s
关键说明
- 编译阶段(生成.o文件):只需要把源代码编译成目标文件,不需要链接任何库,所以
service.o的命令里去掉-lncurses,保留-c和编译参数即可。 - 链接阶段(生成可执行文件):把所有目标文件和需要的库链接起来,这时候加上
-lncurses,告诉链接器去查找ncurses库中的函数实现。
另外,如果你是在64位系统上编译32位程序,要确保已经安装了32位版本的ncurses库(比如Debian/Ubuntu下可以安装libncurses5-dev:i386),否则可能还会出现找不到库的问题。
内容的提问来源于stack exchange,提问作者Ensomme
相关产品推荐
相关产品推荐

