[初级]
[作者] Wick
文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。
文件预览
文件目录树如下,如你所见,非常简单。
- libtest/
- |-- lt.c
- |-- lt.h
- `-- test.c
代码
#lt.c
-
-
-
-
- #include <stdio.h>
-
- void myprint(void)
- {
- printf("Linux library test!\n");
- }
# lt.h
#test.c
-
-
-
-
- #include "lt.h"
-
- int main(void)
- {
- myprint();
- return 0;
- }
先看静态库
首先做成静态库 liblt.a 。
- $ gcc -c lt.c -o lt.o
- $ ar cqs liblt.a lt.o
再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。
- $ gcc test.o liblt.a -o test
这个时候再来看他的引用库情况。
- $ ldd test
- linux-gate.so.1 => (0xffffe000)
- libc.so.6 => /lib/libc.so.6 (0xb7e29000)
- /lib/ld-linux.so.2 (0xb7f6e000)
动态库
做成动态库 liblt.so 。
- $ gcc -c lt.c -o lt.o
- $ gcc -shared -Wall -fPIC lt.o -o liblt.so
链接方法I,拷贝到系统库里再链接,让gcc自己查找
- $ sudo cp liblt.so /usr/lib
- $ gcc -o test test.o -llt
这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。
链接方法II,手动指定库路径
- $ cc -o test test.o -llt -B /path/to/lib
这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :
- $ export LD_LIBRARY_PATH=/path/to/lib
这个时候再来检测一下test程序的库链接状况(方法I情况)
- $ ldd test
- linux-gate.so.1 => (0xffffe000)
- liblt.so => /usr/lib/liblt.so (0xb7f58000)
- libc.so.6 => /lib/libc.so.6 (0xb7e28000)
- /lib/ld-linux.so.2 (0xb7f6f000)
恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
分享到:
相关推荐
### Linux静态库与动态库详解 #### 一、引言 在Linux环境下,库是一种重要的软件组件,用于封装一组相关的函数或数据结构,以便于在不同的应用程序之间共享代码。库通常分为两大类:静态库(static libraries)和...
在Linux系统中,C语言的库分为静态链接库和动态链接库两种类型,它们都是为了实现代码重用和模块化设计的重要工具。本篇文章将深入浅出地介绍这两种链接库的原理、创建方法以及如何在程序中使用。 一、静态链接库 ...
Linux 下静态和动态链接库的生成与使用 Linux 操作系统中,链接库是指一组预先编译好的二进制代码,提供给其他程序使用。链接库可以分为静态链接库和动态链接库两种,下面将详细介绍如何生成和使用这两种链接库。 ...
### Linux静态动态链接库的创建和使用 #### 概述 在Linux环境下,链接库是程序开发中的一个重要组成部分。它们可以被多个程序共享,并且能够有效地管理代码复用。链接库分为静态链接库和动态链接库两种类型。本文...
在Linux操作系统中,库文件是实现程序功能复用的关键组件,分为静态链接库(.a文件)和动态链接库(.so文件)。这两种类型的库在程序编译和运行时有着不同的工作方式。 静态链接库(.a文件)在程序编译期间被链接器...
### Linux下使用动态链接库和静态链接库的项目建立及单步调试 #### 一、动态链接库的建立和单步调试 ##### 1.1 编写用户接口文件 `datetime.h` 首先,创建了一个头文件`datetime.h`,该文件定义了两个结构体:`...
### Linux静态和动态链接库创建和使用 #### 概述 在软件开发过程中,经常会遇到相同功能模块在多个项目中重复出现的情况。例如,多个项目可能都需要实现用户验证功能。为了避免代码重复,提高代码的可维护性和重用...
通过压缩包中的"linux动态库及静态库的创建和使用"文件,你可以找到更具体的实践教程和示例代码,包括如何创建、链接和使用这两种类型的库,以及解决可能出现的问题。这些资料将帮助你深入理解和掌握Linux环境下的...
动态链接库与静态链接库(.a文件)的主要区别在于,静态链接库在编译时会将库中的代码合并到可执行文件中,而动态链接库则在程序运行时才加载到内存中。这使得动态链接库可以被多个进程共享,降低了程序的体积。 二...
下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的) 首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下: //myAPI.h...
Linux 静态链接库与动态链接库的区别及动态库的创建借鉴 一、引言 在 Linux 系统中,函数库的链接可以分为静态链接库和动态链接库两种。静态链接库是在编译时期完成的,所有相关的对象文件和函数库被链接合成一个...
Linux Qt 动态链接库与静态链接库 Linux Qt 动态链接库与静态链接库是 Linux 平台下的库链接机制,分别用于动态链接和静态链接。本文将详细介绍 Linux Qt 动态链接库和静态链接库的概念、实现原理、使用方法和 Qt ...
在Linux系统中,链接库是实现程序功能复用的关键组件,分为静态链接库和动态链接库两种类型。本文主要探讨这两种库的创建、使用及其特点。 1. 静态函数库 静态库通常以`.a`为后缀,如`libxxx.a`。在编译过程中,...
这篇笔记主要探讨了在Linux环境下如何编译C++程序以及如何处理静态和动态链接库。以下是对这些知识点的详细说明: 1. **C++编译过程**: - C++程序的编译通常包括预处理、编译、汇编和链接四个步骤。预处理阶段...
6. **动态链接与静态链接**:动态链接库与静态链接库(`.a`文件)的主要区别在于,静态链接会在编译时将库中的代码合并到可执行文件中,而动态链接则是在程序运行时才加载库。因此,静态链接的程序更大,但不需要...
与静态链接库不同,动态链接库的代码不会被嵌入到可执行文件中,而是到程序运行时才加载到内存中。这带来了几个显著的优势: 1. **资源共享**:多个程序可以共享同一份动态库的内存副本,减少了内存消耗。 2. **...
### Linux静态库与动态库详解 #### 基本概念 **库的定义与作用**:库,实质上是预编译的代码集合,旨在提供重复使用的功能或服务,简化软件开发过程。无论是在Windows还是Linux平台,库的存在极大地提高了编程效率...
### 静态链接库与动态链接库的区别 在软件开发过程中,经常需要使用到库文件,这些库文件可以分为两大类:静态链接库(Static Library)和动态链接库(Dynamic Library)。这两种库的主要功能都是为了重用代码,...
Linux Qt 动态链接库和静态链接库学习笔记 Linux Qt 是一个基于Qt框架的应用程序开发平台,而动态链接库和静态链接库是Linux平台上常用的库链接方式。了解动态链接库和静态链接库的使用是 Qt 开发者必备的技能。 ...
链接库主要分为两种类型:静态链接库和动态链接库。 **静态链接库**(Static Library)是将库中的函数直接嵌入到目标程序中,形成一个独立的可执行文件。在编译时,编译器会将库中的函数代码复制到最终的可执行文件...