返回介绍

4. 静态库

发布于 2024-10-12 21:58:10 字数 1317 浏览 0 评论 0 收藏 0

库是代码集合,分静态库(static libray)和动态库(dynamic/shared library)两类。

静态库由已完成编译的目标文件(object file, .o)打包而成。链接器按需获取其中内容,以静态链接方式合并到可执行文件中。文件名通常以 lib 开头, .a 结尾。

创建

先准备好库源码文件(.c)以及包含原型的头文件(.h)。

将源码文件全部编译成目标文件( -c , .o)。

代码优化发生在编译阶段,链接时不会再次优化,所以要区分 debug 和 release 版本。可分别提供 lib<name>.alib<name>_release.a 两个版本。

$ gcc -c -g -O0 -Wall *.c    # debug version

打包成静态库文件(.a),并创建索引(ranlib)。索引可加快对库中符号的查找速度。

$ ar -rs libdemo.a *.o           # 打包成静态文件。
$ ar -t libdemo.a                # 查看库中目标文件。
$ nm libdemo.a                   # 查看符号。
$ objdump -d -M intel libdemo.a  # 反汇编。

使用

可直接作为输入文件链接。

$ gcc -g -O0 -Wall -I./lib -o test *.c ./lib/libdemo.a

或使用 -l<name> 参数。

<name> 不包含 lib 前缀和 .a 扩展名。

GCC 对链接顺序有要求,要将 *.c 放在链接参数前。先提取符号信息,然后再从链接参数中匹配。顺序出错引发 “undefined reference” 错误。

$ gcc -g -O0 -I./lib -o test  *.c  -L./lib -ldemo
                              ~~~  ~~~~~~~~~~~~~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文