`
wickyl
  • 浏览: 34495 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

简介 Linux 静态与动态链接库

阅读更多
[初级]
[作者] Wick

    文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
    程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。


文件预览

文件目录树如下,如你所见,非常简单。
  1. libtest/  
  2. |-- lt.c  
  3. |-- lt.h  
  4. `-- test.c  


代码

#lt.c
  1. /* lt.c 
  2.  * 
  3.  */  
  4.   
  5. #include <stdio.h>  
  6.   
  7. void myprint(void)  
  8. {  
  9.   printf("Linux library test!\n");  
  10. }  


# lt.h
  1. /* lt.h 
  2.  *  
  3.  */  
  4.   
  5. void myprint(void);  


#test.c
  1. /* test.c 
  2.  * 
  3.  */  
  4.   
  5. #include "lt.h"  
  6.   
  7. int main(void)  
  8. {  
  9.   myprint();  
  10.   return 0;  
  11. }  

先看静态库

首先做成静态库 liblt.a 。
  1. $ gcc -c lt.c -o lt.o  
  2. $ ar cqs liblt.a lt.o  



再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。

  1. $ gcc test.o liblt.a -o test  


这个时候再来看他的引用库情况。
  1. $ ldd test  
  2.         linux-gate.so.1 =>  (0xffffe000)  
  3.         libc.so.6 => /lib/libc.so.6 (0xb7e29000)  
  4.         /lib/ld-linux.so.2 (0xb7f6e000)  


动态库

做成动态库 liblt.so 。
  1. $ gcc -c lt.c -o lt.o  
  2. $ gcc -shared -Wall -fPIC lt.o -o liblt.so  


链接方法I,拷贝到系统库里再链接,让gcc自己查找
  1. $ sudo cp liblt.so /usr/lib  
  2. $ gcc -o test test.o -llt  

这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

链接方法II,手动指定库路径
  1. $ cc -o test test.o -llt -B /path/to/lib

这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :
  1. $ export LD_LIBRARY_PATH=/path/to/lib  


这个时候再来检测一下test程序的库链接状况(方法I情况)
  1. $ ldd test  
  2.         linux-gate.so.1 =>  (0xffffe000)  
  3.         liblt.so => /usr/lib/liblt.so (0xb7f58000)  
  4.         libc.so.6 => /lib/libc.so.6 (0xb7e28000)  
  5.         /lib/ld-linux.so.2 (0xb7f6f000)  

恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。

分享到:
评论
1 楼 iamicebergs 2012-05-08  
再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。


1.$ gcc test.o liblt.a -o test 


这里应该是:
1.$ gcc test.c liblt.a -o test

相关推荐

    linux静态库和动态库

    ### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...

    Linux C静态链接库与动态链接库编程简单介绍

    在Linux系统中,C语言的库分为静态链接库和动态链接库两种类型,它们都是为了实现代码重用和模块化设计的重要工具。本篇文章将深入浅出地介绍这两种链接库的原理、创建方法以及如何在程序中使用。 一、静态链接库 ...

    linux下如何生成使用静态和动态链接库

    Linux 下静态和动态链接库的生成与使用 Linux 操作系统中,链接库是指一组预先编译好的二进制代码,提供给其他程序使用。链接库可以分为静态链接库和动态链接库两种,下面将详细介绍如何生成和使用这两种链接库。 ...

    Linux静态动态链接库的创建和使用

    ### Linux静态动态链接库的创建和使用 #### 概述 在Linux环境下,链接库是程序开发中的一个重要组成部分。它们可以被多个程序共享,并且能够有效地管理代码复用。链接库分为静态链接库和动态链接库两种类型。本文...

    linux静态库与动态库

    在Linux操作系统中,库文件是实现程序功能复用的关键组件,分为静态链接库(.a文件)和动态链接库(.so文件)。这两种类型的库在程序编译和运行时有着不同的工作方式。 静态链接库(.a文件)在程序编译期间被链接器...

    Linux下使用动态链接库和静态链接库的项目建立及单步调试

    ### Linux下使用动态链接库和静态链接库的项目建立及单步调试 #### 一、动态链接库的建立和单步调试 ##### 1.1 编写用户接口文件 `datetime.h` 首先,创建了一个头文件`datetime.h`,该文件定义了两个结构体:`...

    Linux静态and动态链接库 创建和使用

    ### Linux静态和动态链接库创建和使用 #### 概述 在软件开发过程中,经常会遇到相同功能模块在多个项目中重复出现的情况。例如,多个项目可能都需要实现用户验证功能。为了避免代码重复,提高代码的可维护性和重用...

    linux 动态库静态库

    通过压缩包中的"linux动态库及静态库的创建和使用"文件,你可以找到更具体的实践教程和示例代码,包括如何创建、链接和使用这两种类型的库,以及解决可能出现的问题。这些资料将帮助你深入理解和掌握Linux环境下的...

    linux动态链接库的开发实例

    动态链接库与静态链接库(.a文件)的主要区别在于,静态链接库在编译时会将库中的代码合并到可执行文件中,而动态链接库则在程序运行时才加载到内存中。这使得动态链接库可以被多个进程共享,降低了程序的体积。 二...

    Linux下g++编译与使用静态库和动态库的方法

    下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的) 首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下: //myAPI.h...

    linux静态链接库与动态链接库的区别及动态库的创建借鉴.pdf

    Linux 静态链接库与动态链接库的区别及动态库的创建借鉴 一、引言 在 Linux 系统中,函数库的链接可以分为静态链接库和动态链接库两种。静态链接库是在编译时期完成的,所有相关的对象文件和函数库被链接合成一个...

    linux qt 动态链接库 静态链接库.pdf

    Linux Qt 动态链接库与静态链接库 Linux Qt 动态链接库与静态链接库是 Linux 平台下的库链接机制,分别用于动态链接和静态链接。本文将详细介绍 Linux Qt 动态链接库和静态链接库的概念、实现原理、使用方法和 Qt ...

    Linux下动态和静态链接库的使用

    在Linux系统中,链接库是实现程序功能复用的关键组件,分为静态链接库和动态链接库两种类型。本文主要探讨这两种库的创建、使用及其特点。 1. 静态函数库 静态库通常以`.a`为后缀,如`libxxx.a`。在编译过程中,...

    Linux C++编译及 静态/动态 链接库 笔记

    这篇笔记主要探讨了在Linux环境下如何编译C++程序以及如何处理静态和动态链接库。以下是对这些知识点的详细说明: 1. **C++编译过程**: - C++程序的编译通常包括预处理、编译、汇编和链接四个步骤。预处理阶段...

    linux动态链接库示例

    6. **动态链接与静态链接**:动态链接库与静态链接库(`.a`文件)的主要区别在于,静态链接会在编译时将库中的代码合并到可执行文件中,而动态链接则是在程序运行时才加载库。因此,静态链接的程序更大,但不需要...

    linux静态链接库与动态链接库的区别及动态库的创建.pdf

    与静态链接库不同,动态链接库的代码不会被嵌入到可执行文件中,而是到程序运行时才加载到内存中。这带来了几个显著的优势: 1. **资源共享**:多个程序可以共享同一份动态库的内存副本,减少了内存消耗。 2. **...

    Linux静态库和动态库

    ### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...

    静态链接库与动态链接库的区别

    ### 静态链接库与动态链接库的区别 在软件开发过程中,经常需要使用到库文件,这些库文件可以分为两大类:静态链接库(Static Library)和动态链接库(Dynamic Library)。这两种库的主要功能都是为了重用代码,...

    linux qt 动态链接库 静态链接库.docx

    Linux Qt 动态链接库和静态链接库学习笔记 Linux Qt 是一个基于Qt框架的应用程序开发平台,而动态链接库和静态链接库是Linux平台上常用的库链接方式。了解动态链接库和静态链接库的使用是 Qt 开发者必备的技能。 ...

    linux静态链接库与动态链接库的区别及动态库的创建参考.pdf

    链接库主要分为两种类型:静态链接库和动态链接库。 **静态链接库**(Static Library)是将库中的函数直接嵌入到目标程序中,形成一个独立的可执行文件。在编译时,编译器会将库中的函数代码复制到最终的可执行文件...

Global site tag (gtag.js) - Google Analytics