Linux下g++编译时-lncurses放置位置及ncurses链接报错解决
问题原因
这个报错不是单纯的链接参数位置问题,核心是Linux和macOS的ncurses库打包逻辑有差异:
- macOS系统自带的ncurses默认整合了宽字符实现,所有宽字符相关接口(包括
mvwaddwstr、waddnwstr)都在默认的libncurses中,链-lncurses即可正常使用 - Linux发行版通常把ncurses拆分为两个包:普通窄字符版本
libncurses、宽字符版本libncursesw,所有带w前缀的宽字符接口都只存在于libncursesw中,链-lncurses找不到对应符号,就会报undefined reference to waddnwstr错误。
另外要注意:Linux下的GNU ld是按顺序解析符号的,所有依赖库必须放在引用该库的目标文件的后面,如果把-lxxx库参数放在目标文件前面,就算库名写对了也会报未定义引用。你当前Makefile里$(OBJECTS) $(LDFLAGS)的顺序是符合要求的,不需要调整参数先后顺序。你之前查到的调整-lncurses位置的方案,针对的是把库参数放在目标文件前面的错误写法,因为你本身链接顺序没错、只是链错了库,所以那些方案无法生效。
修复方法
直接修改Makefile里的LDFLAGS配置,把-lncurses替换为-lncursesw即可,其余配置(包括你已经加的-D_XOPEN_SOURCE_EXTENDED宏、编译参数顺序)都不需要改动:
# 修正后的LDFLAGS行 LDFLAGS = -lncursesw -lstdc++fs
修改后重新执行make即可正常编译通过。
验证方式
你提供的测试示例代码,在Linux下用如下命令即可正常编译运行,不会出现链接错误:
g++ test_ncurses.cpp -o test_ncurses -lncursesw
注意:如果编译测试代码时提示找不到ncursesw相关头文件或库,先安装对应发行版的ncurses开发包即可,比如Debian/Ubuntu系是
libncursesw5-dev或libncurses-dev,Fedora/RHEL系是ncurses-devel。
内容的提问来源于stack exchange,提问作者user13343210
相关产品推荐
相关产品推荐

