Linux静态库与动态库实例详解

 更新时间:2017年10月11日 15:27:38   作者:JeemyJohn  
这篇文章主要介绍了 Linux静态库与动态库实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

Linux静态库与动态库实例详解

1. Linux 下静态链接库编译与使用

首先编写如下代码:

// main.c
#include "test.h"
int main(){
  test();
  return 0;  
}

// test.h
#include<iostream>
using namespace std;
void test();

// test.c
#include "test.h"
void test(){
 cout<< "test!" <<endl;
}

然后编译:

1. gcc -c test.c //生成目标文件
2. ar crv libtest.a test.o //生成静态链接库libtest.a
3. g++ -o main main.c -ltest //编译main程序同时链接libtest.a静态库
4. ./main //运行main程序

2. Linux 下动态链接库编译与使用

代码与上述一致。

然后编译:

1. g++ -fPIC -shared -o libtest.so test.c //生成动态链接库libtest.so
2. g++ -o main main.c -ltest //调用动态链接库libtest.so
3. ./main //运行main程序

3. 链接时缺失了相关目标文件(.o)

代码与上述一致。

编译过程如下:

1. gcc -c test.c
2. gcc -c main.c
3. gcc -o main main.o

这时,你会发现,报错了:undefined reference to `test'.

这就是最典型的 undefined reference 错误,因为在链接时发现找不到某个函数的实现文件, 本例中test.o文件中包含了test()函数的实现,所以如果按下面这种方式链接就没事了。

1. gcc -o main main.o test.o


【扩展】:其实上面为了让大家更加清楚底层原因,我把编译链接分开了,下面这样编译
也会报undefined reference错,其实底层原因与上面是一样的。

gcc -o main main.c //缺少test()的实现文件 

需要改成如下形式才能成功,将test()函数的实现文件一起编译。

gcc -o main main.c test.c //ok,没问题了

4. 链接时缺少相关的库文件(.a/.so)

在此,只举个静态库的例子,假设源码与上述一致。

1. 把test.c编译成静态库:
  gcc -c test.c
  sr -rc test.a test.o
  gcc -c main.c

2. 生成可执行程序:
  gcc -o main -main.o

    此时同样出现 undefined reference to `test'报错。其根本原因也是找不到test()函数的实现文
  件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个
  库,链接命令修改为如下形式即可。
  1. gcc -o main main.c ./test.a

5. 多个库文件链接顺序问题

这种问题也非常的隐蔽,不仔细研究你可能会感到非常地莫名其妙。我们依然回到第3小节所讨论
的问题中,在最后,如果我们把链接的库的顺序换一下,看看会发生什么结果?

1. gcc -o main main.o func.a test.a

我们会得到如下的编译错误:

1. test.a(test.o): In function `test': 
2. test.c:(.text+0x13): undefined reference to `func' 
3. collect2: ld returned 1 exit status 
因此,我们需要注意,在链接命令中给出所依赖的库时,需要注意库之间的依赖顺序,依赖其他库
的库一定要放到被依赖库的前面,这样才能真正避免undefined reference的错误,完成编译链接。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Ubuntu虚拟机开机黑屏系列解决方法总结

    Ubuntu虚拟机开机黑屏系列解决方法总结

    ubuntu虚拟机玩的好好的,突然不知怎么着图形界面就卡住了,等待了好一会也不见恢复,没辙只能考虑强行关断虚拟机,一关掉虚拟机又完全卡死了,紧接着重启vmware,发现一进入就是黑屏,所以本文总结了Ubuntu虚拟机开机黑屏系列解决方法,需要的朋友可以参考下
    2024-07-07
  • 在阿里云购买云服务器并安装宝塔面板的步骤

    在阿里云购买云服务器并安装宝塔面板的步骤

    这篇文章主要介绍了在阿里云购买云服务器并安装宝塔面板的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Linux中Curl参数详解实践应用

    Linux中Curl参数详解实践应用

    在现代网络开发和运维工作中,curl 命令是一个不可或缺的工具,它是一个利用 URL 语法在命令行下工作的文件传输工具,支持多种协议,如 HTTP、HTTPS、FTP 等,本文给大家介绍了Linux中Curl参数详解实践应用,需要的朋友可以参考下
    2025-01-01
  • centos7中firewall防火墙命令详解

    centos7中firewall防火墙命令详解

    本篇文章主要介绍了centos7中firewall防火墙命令详解,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • Linux实现自动登录的实例讲解

    Linux实现自动登录的实例讲解

    在本篇文章里小编给大家分享的是关于Linux实现自动登录的相关实例以及知识点,需要的朋友们参考学习下。
    2019-10-10
  • Linux服务器和docker时区修改问题

    Linux服务器和docker时区修改问题

    这篇文章主要介绍了Linux服务器和docker时区修改问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Mysql常用命令 详细整理版

    Mysql常用命令 详细整理版

    MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-deployed)的软件中去。
    2010-12-12
  • linux操作之清空文件方式

    linux操作之清空文件方式

    这篇文章主要介绍了linux操作之清空文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Centos8最小化部署安装OpenStack Ussuri的详细教程

    Centos8最小化部署安装OpenStack Ussuri的详细教程

    这篇文章主要介绍了Centos8最小化部署安装OpenStack Ussuri的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Linux上安装搭建Nginx服务器的详细步骤

    Linux上安装搭建Nginx服务器的详细步骤

    本篇文章主要介绍了Linux上搭建Nginx服务器的详细步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论