cgdb UTF-8乱码

support utf-8
cgdb github上的issues里面有人提到了这个问题,维护者回复的是须要使用libncursesw这个支持宽字符的库来解决这个问题。linux

查看是否安装了该库ldconfig -p | grep libncursesw,未安装则查看有哪些库:git

thomas@ubuntu:~$ apt search libncursesw
Sorting... Done
Full Text Search... Done
`libncursesw5`/bionic-updates,now 6.1-1ubuntu1.18.04 amd64
  shared libraries for terminal handling (wide character support)

`libncursesw5-dbg`/bionic-updates 6.1-1ubuntu1.18.04 amd64
  debugging/profiling libraries for ncursesw

`libncursesw5-dev`/bionic-updates,now 6.1-1ubuntu1.18.04 amd64
  developer's libraries for ncursesw

分别有三个,我当时选择的是第一个libncursesw5,进行了安装,结果configure的时候检测不到libncursesw,只检测到了libncurses。对比目录里面的文件:github

thomas@ubuntu:/usr/lib/x86_64-linux-gnu$ ls /usr/lib/x86_64-linux-gnu/libncurses* -l
-rw-r--r-- 1 root root 297196 May 23  2018 /usr/lib/x86_64-linux-gnu/libncurses.a
-rw-r--r-- 1 root root 127016 May 23  2018 /usr/lib/x86_64-linux-gnu/libncurses++.a
-rw-r--r-- 1 root root     31 May 23  2018 /usr/lib/x86_64-linux-gnu/libncurses.so

发现没有libncursesw,ldconfig -p | grep libncursesw:shell

thomas@ubuntu:/usr/lib/x86_64-linux-gnu$ ldconfig -p | grep libncursesw
    libncursesw.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/libncursesw.so.5

并无libncursesw.so, ld就找不到了。sudo apt install libncursesw5-dev,安装完开发者使用的库,这时/usr/lib/x86_64-linux-gnu/目录下才出现libncursesw.so。这时再configure,显示使用的再也不是libncurses,而是libncursesw。make,make install。运行完美支持utf-8。ubuntu

以上啰嗦一大堆,直接说sudo apt install libncursesw5-dev,问题解决。可是少了解决问题的过程和思路。在这个过程当中,有两个问题要理清。vim

  1. libxx、libxx-dgb、libxx-dev有什么区别,分别什么时候用?
  2. ld为何不连接libxx.so.nn?
  • libxx、libxx-dgb、libxx-dev有什么区别,分别什么时候用?

libxx只包含了基本的运行时,若是只需运行软件,不用编译软件,安装这个。ionic

libxx-dev包含了运行时和头文件和其余库文件,若是编译其余软件须要连接这个库,安装这个。ide

libxx-dbg包含了运行时和头文件和其余库文件,以及调试信息。debug

由于这里我须要从源码编译cgdb,因此就须要选择libncursesw-dev调试

  • ld为何不连接libxx.so.nn?

    首先得让ld找的到,能够看vim /etc/ld.so.conf,/etc/ld.so.conf内容是:
    include /etc/ld.so.conf.d/.conf
    /etc/ld.so.conf.d/
    .conf这些文件就描述了ld搜索库时会搜索的目录。

    编译时使用的是-lncursesw,那么ld只会在这些目录下搜索libncursesw.so这个文件。注意是libxx.so,/lib/x86_64-linux-gnu/libncursesw.so.5虽然在搜索目录中,可是不知足后缀为.so。若是要强制使用它,则直接把它做为目标文件便可:
    gcc a.o /lib/x86_64-linux-gnu/libncursesw.so.5 -o a

相关文章
相关标签/搜索