linux静态库的生成与使用(转)

linux静态库的生成与使用(转)

库是一种软件组件技术,库里面封装了数据和函数。

库的使用可以使程序模块化。

Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。

Linux通常把库文件存放在/usr/lib或/lib目录下。

Linux库文件名由:前缀lib、库名和后缀3部分组成,其中动态链接库以.so最为后缀,静态链接库通常以.a作为后缀。

在程序中使用使用静态库和动态库时,他们载入的顺序是不同的。

静态库的代码在编译时就拷贝的应用程序中,这样的优点是节省编译时间。

动态链接库时程序在开始运行后调用库函数时才被载入。

静态库的创建和使用:

1、在一个头文件种声明静态库所导出的函数。

2、在一个源文件种实现静态库所导出的函数。

3、编译源文件,生成可执行代码。

4、将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认的存放库文件的目录下。

下面通过一个例子来说明:mylib.h种存放的是静态库提供给用户使用的函数的声明,mylib.c实现了mylib.h种声明的函数。

头文件:mylib.h

#ifndef _MYLIB_H_
#define _MYLIB_H_
 
void weclome(void);
void outString(const char *str);
 
#endif

源文件:mylib.c

#include "mylib.h"
#include
 
void welcome(void)
{
    printf("welcome to libmylib\n");
}
 
void outString(const char *str)
{
    if(str != NULL)
        printf("%s\n", str);
}

1>编译mylib.c生成目标文件:gcc -o mylib.o -c mylib.c

2>将目标文件加入到静态库中:ar rcs libmylib.a mylib.o

3>将静态库copy到Linux的库目录(/usr/lib或者/lib)下:

cp libmylib.a /usr/lib/libmylib.a

编写调用库函数的测试程序test.c:

#include "mylib.h"
#include
 
int main(void)
{
    printf("create and use library:\n");
    welcome();
    outString("it‘s successful\n");
 
    return 0;
}

4>使用静态库编译:gcc -o test test.c -lmylib

这里注意,编译时无需带上前缀和后缀。

5>运行可执行程序test: ./test

create and use library:
welcome to libmylib
it‘s successful

在Linxu下,可以使用ar命令来创建和修改静态库。

这些在linux下man ar一下就可以得到参数,这里说明几个常用的

d:从库中删除成员文件。

r:在库中加入成员文件,若存在,则替换。

c:创建一个库。

s:无论ar命令是否修改了库内容,都强制重新生成库符号表。

其他的命令用时再man。

上面这五步是基本的使用,还有需要的话,就要深入的学习了。

分类: Linux学习笔记

时间: 2024-12-28 17:31:58

linux静态库的生成与使用(转)的相关文章

Linux静态库生成指南

Linux静态库生成指南 Linux上的静态库,其实是目标文件的归档文件.在Linux上创建静态库的步骤如下: 写源文件,通过 gcc -c xxx.c 生成目标文件. 用 ar 归档目标文件,生成静态库. 配合静态库,写一个使用静态库中函数的头文件. 使用静态库时,在源码中包含对应的头文件,链接时记得链接自己的库. 下面通过实例具体讲解. 写源文件,生成目标文件. 第一个源文件 my_print.c #include <stdio.h> void cout(const char * mess

VS2008 动态库和静态库的生成和加载

第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\VC 确定 下一步 应用程序类型:选择DLL 完成 2) 编写代码: 2-1) 增加一个头文件:dllTest.h #define ICILIB_UTIL_API __declspec(dllexport)  //生成动态库时,同时在Debug或Release目录下生成.lib和.dll文件. class IC

QT中静态库的生成与使用

一. 静态库的生成    1. 测试目录: lib    2. 源码文件名: mywindow.h, mywindow.cpp, 类MyWindow继承于QPushButton, 并将文字设置为"I'm in class MyWindow";    3. 编写项目文件: mywindow.pro       注意两点:       TEMPLATE = lib       CONFIG   += staticlib    4. 生成Makefile:       qmake    5.

关于Linux静态库和动态库的分析

关于Linux静态库和动态库的分析 关于Linux静态库和动态库的分析 1.什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的本质不同,因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 2.库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代

linux 静态库、共享库

一.什么是库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的. Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.Linux系统有几个重要的目录存放相应的函数库,如/lib    /usr/lib. 二.静态函数库.动态函数库 A.  这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都被整合进目标代码中,他的优点就显而易见了,即编译后的执行

Linux 静态库&amp;动态库调用

1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不兼容的.本文仅限于介绍linux下的库.2.库的种类linux下的库有两种:静态库和共享库(动态库).二者的不同点在于代码被载入的时刻不同.静态库的代码在编译过程中已经被载入可执行程序,因此体积较大.共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小.3.库存在

linux 静态库,makefile

mkdir testlib,组织文件目录如下 my_math.h int add(int a, int b); int subtract(int a, int b); my_math.c #include "../include/my_math.h" int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } my_print.h #include <stdio.h>

malloc,colloc,realloc内存分配,动态库,静态库的生成与调用

 1.在main方法里面直接定义一个非常大的数组的时候,可能会出现栈溢出:错误代码演示: #include<stdio.h> #include<stdlib.h> void main() { int a[1024 * 1024]; int num = 100; system("pause"); } 错误截图: 2.在定义数组的时候要定义数组的长度,否则会出现错误.(特例:在GCC编译器下,不会出现错误(因为标准不一样)). 3.打印并且赋值的是: for (

makefile编写---.a静态库的生成和调用

#.SUFFIXES: .c .o Cc =gcc #OSA=/data/users/osa IncDir=-I. -I./ Debug = -g Cflags = -c $(DEBUG) Libs = -lpthread Lib_Dir=./#/data/users/osa/api/ #PKIOBJ=PKITool.o kdmd5.o Lib=alg.aPkiObj=alg.o .c.o: $(Cc) $(Cflags) $(IncDir) $*.c all: PKITool #clean P