Linux同时安装ncurses V5与V6时如何指定编译使用的版本
Debian升级到Buster后默认将ncurses6设为全局优先链接版本,同机安装ncurses5、ncurses6时,可通过以下几种方式指定编译时使用ncurses5,按稳定性从高到低排序:
方案1:通过
pkg-config显式传入ncurses5的编译链接参数(最推荐,适配绝大多数构建场景)
Debian系的ncurses5会单独注册pkg-config配置文件,编译时不要直接使用通用的-lncurses参数,直接调用pkg-config拉取对应版本的编译、链接参数即可:
宽字符版本(绝大多数项目默认使用,支持中文等多字节字符显示)使用ncursesw5作为配置名,窄字符版本使用ncurses5。
手动编译示例:gcc your_source.c -o your_program $(pkg-config --cflags --libs ncursesw5)如果使用Autotools、CMake、Makefile等构建系统,直接将原配置中搜索、链接ncurses的规则从通用的
ncurses/ncursesw改为ncursesw5即可,无需依赖系统默认的库搜索优先级。方案2:手动指定头文件、库文件搜索路径覆盖默认优先级
如果现有构建脚本硬编码了-lncurses参数、不便修改,可以在编译参数中优先指定ncurses5的文件路径,让编译器优先找到v5版本:
Debian x86_64架构下,ncurses5的头文件默认存放在/usr/include/ncurses5,库存放在/usr/lib/x86_64-linux-gnu路径下,编译参考命令:gcc your_source.c -o your_program -I/usr/include/ncurses5 -L/usr/lib/x86_64-linux-gnu -lncursesw5注意:
-L参数必须放在-l链接参数之前,否则编译器仍会优先搜索到默认路径下的ncurses v6版本。方案3:通过环境变量临时指定编译优先级(仅当前终端会话生效)
如果不想修改原有编译命令,可以在执行编译前,在当前shell会话导出环境变量,让编译器优先检索ncurses5的路径:export C_INCLUDE_PATH=/usr/include/ncurses5:$C_INCLUDE_PATH export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH export LDLIBS="-lncursesw5"导出完成后直接执行原有编译命令即可,退出当前终端后配置自动失效,不会修改全局默认配置,不会影响系统其他程序的编译运行。
- 禁止直接修改
/usr/lib下的系统软链接,强行将通用libncurses.so指向v5版本会破坏所有依赖ncurses v6的系统程序、其他软件的编译和运行,属于高危操作。 - 编译完成后可执行
ldd 编译生成的二进制文件 | grep ncurses验证链接结果,如果输出内容包含libncursesw.so.5即为链接v5成功,若显示libncursesw.so.6说明参数配置有误,需检查搜索路径参数的顺序。 - 如果项目使用ncurses的C绑定(ncurses),对应的v5版本库名为
ncurses++w5,pkg-config配置名同为ncurses++w5,替换对应参数即可。
内容的提问来源于stack exchange,提问作者user3161924

