网站运营
位置:首页>> 网站运营>> Linux静态库与动态库实例详解

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

作者:JeemyJohn  发布时间:2023-08-19 22:30:20 

标签: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的错误,完成编译链接。

来源:http://blog.csdn.net/u013709270/article/details/53264141

0
投稿

猜你喜欢

  • 最近集中精力学习了一下前辈们的网站营运及推广经验,和如何实现盈利的方法,针对目前我所运营的深圳掘吧网不温不火的现状,决定作出一次尝试:去扫街
  • nmap工具检测开放端口Nmap是Network Mapper的简称。Nmap是一款免费、开源的网络发现和侦察工具。Nmap可以扫描网络中的
  • 前言其实,在服务器的安全设置方面,我虽然有一些经验,但是还谈不上有研究,所以我写这篇文章的时候心里很不踏实,总害怕说错了会误了别人的事。本文
  • 做了几个英文站其中有成功的也有失败的今天做了个总结英文站的确比中文站更加赚钱首先十分明显的就是有更多的广告联盟只接受英文站,也有不少广告联盟
  •       见到论坛里有部分朋友反映发布内容,内容缩略图选择为“站内选择”方式上传图片,上
  • 今天我们来讨论一下有关GoDaddy的Linux主机帐户的绝对路径问题,一定要认真看哦!~/home/content/1/2/3/usern
  • 接触网络也有好几年时间了,每天都在做网站,学习经验知识,今年在站长网上学到的知识最多了,特别是这里有热心的站长朋友们和一些老菜鸟们的经验互相
  • 笔者服务于一家小的电脑公司,随着业务的不断拓展,公司传统办公模式的弊端逐步显露出来:员工经常出差导致命令无法迅速上传下达;下级汇报工作时负责
  • 随着互联网的快速发展,越来越多的网站面临着改版的需求,当我们隔一段时间再上某网站时,有时会惊讶的发现该网站已经改版了。其实网站改版就像是做整
  • 英文网站建设与中文网站建设的区别不仅仅是使用中文与使用英文的差别。使用时有时出现乱码,这给企业带来很大的损失。由于中文字形复杂,并且电脑上的
  • 一位站长朋友,他问我这样的问题,购买的Godaddy主机IP被封,他通过切换操作系统进行更换IP,换好新的IP后,发现域名不能访问,打不开页
  • Google通用搜索无所不包,它包括博客搜索、图书搜索、Google Base和产品搜索、代码搜索、Google列表搜索、Google图像搜
  • 有一阵子着实对Ubuntu的网络配置很迷惑,耐下心来仔细上网找了找,有点小心得,总结一下。先说下大概的配置过程,再去细究一些情况。一、配置大
  • Moderator 是一个基于 Adobe AIR 的应用程序,可以运行在桌面,它包含一个 WordPress 插件,用户可以直接在桌面上管
  • 为了实现在Internet中快速共享网络资源的目的,很多用户使用IIS服务器内置的FTP组件架设FTP服务器。由于它和Windows系统的紧
  • 我是一名专职的设计师,工作之余,经常会去一些个威客网承接的任务,来充实一下自己的,我去的目的也并不是单单只为钱,也为了去消磨一点时间,可是最
  • 1、据说淘宝封百度了。必须的。我甚至认为来的有点晚,不够干脆。2、最简单的原因:1》淘宝长期积累和培养出来的商品管理很牛,商家信息很丰富。是
  • 我们可能因为一些特殊需求网站服务器使用 Windows Server 系统来跑,没有采用Linux环境。而Webp格式的图像越来越多的网站采
  • 如何进行关键词分析?关键词怎么确定?从这篇文章,我们可以大体了解选择关键词的基本思路:1.选择符合自己实力的关键词2.不选择流量太低的关键词
  • 网络经过这么多年几次锤炼,网站和站长意识根据网民的要求与自身发展也在改变,也应该要改变!互联网网民的素质有这么几个过程A:好奇,什么网站都去
手机版 网站运营 asp之家 www.aspxhome.com