文档章节

静态链接 Ncurses

哔u哔u
 哔u哔u
发布于 2018/08/29 20:31
字数 1071
阅读 54
收藏 0

静态链接 Ncurses

网站:链接

文章已迁移:链接

情景描述

平时调用各种 C 库时,免不了各种链接。记得当初学习 C 语言时,为了使用 math 库,可没少折腾。Ncurses 作为一个字符终端的图形库,是相当实用的。不过,并不是所有的用户都会在他的系统上安装这个库,所以,我们可以考虑把 Ncurses 包含到我们的程序里。这就是静态链接。

先简要说明一下静态链接和动态链接。无论是静态库文件(.a)还是动态库文件(.so),都是二进制文件。不同的是,当我们的程序进行静态链接时,是直接把静态库文件给包含进程序里了。而动态链接不会这样做,程序会在运行时,加载库文件,同时,一个动态库文件,可以被多个程序共享加载。换言之,静态链接,是每一个程序都包含了库文件,动态链接是多个程序从同一个库文件共享代码。

显然,动态链接可以减小程序文件的大小,而且节约内存。毕竟一个库只需要加载到内存一次,其他程序使用时,不需要再次加载。而且程序本身并没有包含库文件,所以程序文件不会很大。但是,如果用户的系统没有这个库,就完了。程序就无法运行了。

静态链接就可以避免用户没有安装依赖库的问题。程序通过直接包含库文件,使得程序在加载到内存时,已经加载了库文件。但是,这种做法,会使程序文件比较大,而且,由于每个程序加载时,都加载了库文件,如果这些程序依赖同一个库,必然会造成内存浪费。不过,这样做不必考虑依赖问题,可以确信程序在用户那里能运行。

啰里啰嗦写了一堆不相关的,算是说明了为啥要静态链接 Ncurses,现在进入重点,如何静态链接。当然,你的系统肯定是要已经安装了 Ncurses 的,注意,不只是运行环境,还有开发环境。

安装开发环境

注意,这里是针对 DEB 系的 Linux 系统,Ncurses的版本是 5

sudo apt install libncurses5-dev ncurses-doc

测试代码

我们写一段测试代码,代码就放在主目录下吧。

// test.c
#include <ncurses.h>

int main(void) {
    initscr();
    printw("Hello world\n");
    refresh();
    getch();
    endwin();
    return 0;
}

常规链接

我们使用常规的编译指令,也是动态链接,编译一下。

gcc test.c -o test -lncurses

我们使用 ldd 命令查看生成的可执行文件的依赖

# xxx @ xxx in ~ [12:52:45]
$ ldd test
    linux-vdso.so.1 (0x00007ffd8990a000)
    libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f69d5891000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f69d5667000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f69d52c8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f69d50c4000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f69d5cb6000)

静态链接

现在我们使用静态链接,注意指令的链接依赖顺序。

gcc test.c -o test -static -lncurses -ltinfo

注意,先链接 ncurses(-lncurses),然后是 tinfo(-ltinfo)。下面是 ldd 命令的输出。

# xxx @ xxx in ~ [12:55:13]
$ ldd test
    不是动态可执行文件

由于我们使用了静态链接,所以,可执行文件 test 里包含了所有的动态库的静态库版本。也就是,test 里包含了 linux-vdso、libncurses、libtinfo、libc、libdl 这些库。

现在的可执行文件 test 可以在一个没有安装 ncurses 的系统上运行了。

中文支持

如果你想使用 Ncursesw 来支持中文等字符(当然你要安装 ncursesw 对吧),可以参考如下。

// test.c 支持中文
#include <ncurses.h>
#include <locale.h> //setlocale()函数

int main(void) {
    setlocale(LC_ALL,""); //使用本地字符集
    initscr();
    printw("Hello world.\n");
    printw("打得好的.\n");
    refresh();
    getch();
    endwin();
    return 0;
}

编译指令:

gcc test.c -o test -static -lncursesw -ltinfo

© 著作权归作者所有

下一篇: 哔u哔u 上线啦
哔u哔u
粉丝 2
博文 9
码字总数 5916
作品 0
阜阳
程序员
私信 提问
Ubuntu 10.10下安装ncurses-devel

解决Ubuntu 10.10 使用配置Linux 内核时,出现缺少'ncurses-devel'库支持。 * Unable to find the ncurses libraries or the required header files. 'make menuconfig' requires the ncurse......

庸夫俗子
2015/04/07
116
0
ncurses 5.8 发布,字符终端GUI开发库

Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。 Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: 只要您喜欢,您可以使用整个屏幕...

红薯
2011/02/27
876
1
NCurses 6.0 发布,字符终端 GUI 处理库

NCurses 6.0 发布,此版本源代码兼容 NCurses 5.0-5.9,提供一个新的应用二进制接口(ABI)。虽然源代码仍然可以配置到支持 NCurses 5 ABI,此版本的目的是要提供相关的扩展,但是二进制不兼容...

oschina
2015/08/10
2.8K
2
在raspberrry pi 上建立linux kernel开发环境

友情提示: 限于raspberry pi CPU性能,整个编译过程大概需要5h,你可以晚上做好准备工作,让raspberry pi工作一晚,第二天早上收获你的kernel。 我用的是pi 操作镜像是 2012-08-16-wheezy-...

金衣人
2012/08/24
664
0
如何在 Linux 中安装 Ncurses 库

GNU Ncurses 是一个允许用户编写基于文本的用户界面(TUI)的编程库。许多基于文本的游戏都是使用这个库创建的。一个受欢迎的例子是 PacVim,这是一款学习 VIM 命令的 CLI 游戏。在这篇简要的...

18%
2018/05/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈Adapter适配器模式

一、前言 适配器模式分为两类,所谓“适配”就是适当的配合或者恰当的配合,想一下电源的适配器,完成的作用是将交流电220V转化成不同的直流电压,来对手机、电脑、台灯等充电,如果没有这些...

青衣霓裳
4分钟前
0
0
Kubernetes+Docker+Istio 容器云实践

随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求。近年来,互联网、移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于Kubernetes+Docker的...

宜信技术学院
6分钟前
0
0
工作流升级登场,云盒子让文件流转更顺畅

云盒子企业网盘作为深耕企业私有云盘领域的老选手, 深谙企业用户对文档管理的细致化追求, 同时从日积月累的各行各业用户口中,收集产品使用体验和痛点, 将“用户体验”贯穿整个网盘产品的设计...

yhz66
12分钟前
0
0
linux:nohup 不生成 nohup.out的方法

nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部分,/dev/null是一个虚拟的空设备(类似物理中的黑洞),任何输出信息被重定向到该设备后,将会石沉...

OSC知行合一
13分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部