实验3:动态库和静态库的制作和使用
- 格式:doc
- 大小:436.50 KB
- 文档页数:2
静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。
1. 静态库编译静态库是一种在编译时被链接到程序中的库文件,它包含了程序所依赖的所有函数和数据结构,因此程序在运行时不需要再加载库文件。
静态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件(.o 或 .obj)。
(2)将多个目标文件打包成一个静态库文件,通常使用 ar 工具完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.a 的静态库文件:$ ar rcs libfoo.a foo1.o foo2.o ...其中,rcs 参数分别表示创建、向库文件中添加目标文件和生成索引表。
(3)在编译器中使用静态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.a 的静态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 参数指定库文件搜索路径,. 表示当前目录;-l 参数指定链接库文件,实际上是将其前缀 lib 和后缀 .a 去掉,即 foo。
2. 动态库编译动态库是一种在程序运行时动态加载的库文件,它只包含程序所需要的部分函数和数据结构,因此可以减小程序的尺寸和加载时间。
动态库的编译过程包括以下步骤:(1)创建一个或多个源文件,使用编译器将它们编译成目标文件。
(2)将多个目标文件打包成一个共享库文件,通常使用 ld 或链接器完成此操作。
例如,在 Linux 系统下,可以使用以下命令创建名为 libfoo.so 的动态库文件:$ gcc -shared -o libfoo.so foo1.o foo2.o ...其中,-shared 参数表示生成共享库文件。
(3)在编译器中使用动态库,需要将其链接到目标程序中。
在Linux 系统下,可以使用以下命令编译名为 main.c 的源文件和名为libfoo.so 的动态库文件:$ gcc -o main main.c -L. -lfoo其中,-L 和 -l 参数的含义同静态库。
动态库和静态库的制作过程我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库和动态库两种。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。
在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。
第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。
hello.h(见程序1)为该函数库的头文件。
main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。
#ifndef HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H程序1: hello.h#include <stdio.h>void hello(const char *name){printf("Hello %s!\n", name);}程序2: hello.c#include "hello.h"int main(){hello("everyone");return 0;}程序3: main.c第2步:将hello.c编译成.o文件;无论静态库,还是动态库,都是由.o文件创建的。
因此,我们必须将源程序hello.c通过gcc先编译成.o文件。
在系统提示符下键入以下命令得到hello.o文件。
# gcc -c hello.c#(注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。
C语言程序静态库和动态库的创建及其应用在用c写程序时,很多时候需要存储一些简单的数据,如果为此而用mysql数据库就有些大才小用了,可以把这些数据以结构的形写入文件,然后再需要时读取文件,取出数据。
如下是定义函数的源文件和头文件:源文件struct.c:#include "struct.h"//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示写入成功,返回FALSE表示写入失败int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode){ int ret;FILE *fileID = NULL;fileID = fopen(fileName,mode);if (fileID == NULL){perror("fopen");goto writeEnd;}rewind(fileID);ret = fwrite(buffer,bufferLen,1,fileID);if (ret <= 0){perror("fwrite");goto writeEnd;}if (fileID != NULL){fclose(fileID);fileID = NULL;}return TRUE;writeEnd:if (fileID != NULL){fclose(fileID);fileID = NULL;}return FALSE;}//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示读取成功,返回FALSE表示读取失败int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode){ int ret;FILE *fileID = NULL;fileID = fopen(fileName,mode);if (fileID == NULL){perror("fopen");goto readEnd;}rewind(fileID);memset(buffer,0,sizeof(buffer));ret = fread(buffer,bufferLen,1,fileID);if (ret >= 0){strcat(buffer,"\0");}else{perror("fread") ;goto readEnd;}if (fileID != NULL){fclose(fileID);fileID = NULL;}return TRUE;readEnd:if (fileID != NULL){fclose(fileID);fileID = NULL;}return FALSE;}头文件struct.h:#ifndef OWNSTRUCT_H_#define OWNSTRUCT_H_#include#include#include#define FALSE 0#define TRUE 1//第一个参数是要写入的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示写入成功,返回FALSE表示写入失败int writeStruct(const char *fileName,char *buffer,int bufferLen,char *mode);//第一个参数是要读取的文件名,第二个参数是缓冲区,第三个参数是缓冲区大小,第四个参数是打开文件流的形态,返回TRUE表示读取成功,返回FALSE表示读取失败int readStruct(const char *fileName,char *buffer,int bufferLen,char *mode);#endif为了使用方便,可以把这两个函数接口定义为动态链接库或静态链接库。
Linux下Makefile中动态链接库和静态链接库的⽣成与调⽤Linux下Makefile中动态链接库和静态链接库的⽣成与调⽤ 背景:写这篇博客的原因是:最近在搞嵌⼊式,需要交叉编译opencv库⽂件,⾃⼰写Makefile,通过arm-linux-g++编译、链接、⽣成可执⾏⽂件,从⽽实现了移植的过程。
平台是Toradex的Apalis TK1,三千多元,买回来我就后悔了,全是英⽂资料,还各种Bug,迟迟⽆法上⼿。
早知如此,还不如直接买Nvidia的Jetson TK1呢。
书归正传,今天写⼀下Makefile⽂件中,动态链接库和静态链接库的⽣成与调⽤。
⼀、概念 动态链接库:是⼀种不可执⾏的⼆进制程序⽂件,它允许程序共享执⾏特殊任务所必需的代码和其他资源。
Windows平台上动态链接库的后缀名是”.dll”,Linux平台上的后缀名是“.so”。
Linux上动态库⼀般是libxxx.so;相对于静态函数库,动态函数库在编译的时候并没有被编译进⽬标代码中,你的程序执⾏到相关函数时才调⽤该函数库⾥的相应函数,因此动态函数库所产⽣的可执⾏⽂件⽐较⼩。
由于函数库没有被整合进你的程序,⽽是程序运⾏时动态的申请并调⽤,所以程序的运⾏环境中必须提供相应的库。
动态函数库的改变并不影响你的程序,所以动态函数库的升级⽐较⽅便。
静态链接库:这类库的名字⼀般是libxxx.a;利⽤静态函数库编译成的⽂件⽐较⼤,因为整个函数库的所有数据都会被整合进⽬标代码中,他的优点就显⽽易见了,即编译后的执⾏程序不需要外部的函数库⽀持,因为所有使⽤的函数都已经被编译进去了。
当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
Makefile:利⽤IDE开发调试的⼈员可能对Makefile不⼤理解,其实Makefile就是完成了IDE中的编译、链接、⽣成等⼯作,并遵循shell脚本中变量定义与调⽤的规则。
⼆、编写Makefile实现编译与链接1、准备⽂件 我们写⼀个简单的⼯程吧,此⼯程包含3个⽂件,分别是main.cpp,func.cpp和func.h。
Linux下静态库和动态库(共享库)的制作与使用Linux 操作系统支持的函数库分为静态库和动态库,动态库又称共享库。
linux 系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。
静态函数库:这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。
当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。
动态函数库:这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。
由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。
动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。
下面来介绍linux 静态函数库的创建和使用:例程add.h add.c sub.hsub.cmain.c: add.h #ifndef ADD_H #define ADD_H int add(int x,int y); #endif add.c #include stdio.h #include add.h int add(int x,int y){ return (x+y);} ------------------------------------- -------------------------------sub.h #ifndef SUB_H #define SUB_H int sub(int x,int y); #endif sub.c #include stdio.h#include sub.h int sub(int x,int y){ return (x-y);} -----------------------------------------------------------------------main.c #include stdio.h#include sub.h #include add.h int main() { inta,b;a = add(1,2);b = sub(10,5);tips:感谢大家的阅读,本文由我司收集。
静态库的使用与创建静态库是一种预编译的库,它包含了一组已经编译好的目标文件(.o文件)。
使用静态库可以将一些常用的函数、类或其他代码打包成一个单独的文件,以便在多个应用程序中重复使用。
使用静态库:1. 创建静态库:首先需要将要打包的源代码编译成目标文件,然后使用静态库工具(如ar)将目标文件打包成静态库文件(.a文件)。
2. 链接静态库:在编译应用程序时,需要引用静态库文件,并将其链接到应用程序的可执行文件中。
可以使用编译器的命令行选项来指定链接静态库的路径和名称。
创建静态库的一般步骤如下:1. 编写源代码文件:创建需要打包进静态库的源代码文件(.c、.cpp、.h等)。
2. 编译源代码文件:使用编译器将源代码文件编译成目标文件(.o文件)。
例如,使用gcc编译C文件:`gcc -c file.c -o file.o`。
3. 打包目标文件:使用静态库工具(如ar)将目标文件打包成静态库文件。
例如,使用ar工具创建静态库:`ar rcs libfile.a file1.o file2.o ...`。
4. 链接静态库:在应用程序的编译过程中,使用编译器的命令行选项来链接静态库文件。
例如,使用gcc链接静态库:`gcc main.c -o main -L<path_to_lib> -lfile`。
注意事项:在创建静态库时,需要保持相应源代码文件的可移植性和独立性,以便在不同的项目中使用。
链接静态库时,需要确保目标文件和静态库文件的路径正确,并且编译器能够找到它们。
如果静态库依赖于其他库,需要确保这些依赖库也正确链接到应用程序中。
使用静态库可以提高代码的重用性和管理性,尤其是对于一些通用的函数或模块。
这种方法适用于部署到嵌入式设备、静态链接的可执行文件等场景。
xianga…11月23日正文字体大小:大中小静态库与动态库的建立与使用(2011-11-03 13:27:55)转载▼分类:C/C标签:杂谈转《深入浅出Visual C++动态链接库编程》作者宋宝华静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。
引用:一、通用:格式如:#pragma comment(lib,"XXX.lib") //指定与静态库一起连接二、针对开发环境:1、如果使用VC,可以在Project Setting-->Link中加入你的静态库,也可以直接把该.lib 文件加入到你的工程中2、如果使用Visual Studio,位置在项目→配置属性→连接器→输入→附加依赖项中加入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。
这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。
图1 建立一个静态链接库如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数#endif//文件:lib.cpp#include "lib.h"int add(int x,int y){return x + y;}编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。