实验3:动态库和静态库的制作和使用

合集下载

VS2008静态库和动态库的创建和调用

VS2008静态库和动态库的创建和调用
int AddFun(int x, int y) {
return x + y; } 然后编译生成静态库 libTest.lib.(该文件默认生成在 debug 中)
(2)调用动态库
创建一个 Win32 Console 控制台工程.工程名叫 TestLib 如下:
创建完成后,在 TestLib.cpp 文件中代码如下: #include "stdafx.h" #include "libTest.h" //调用静态库中的头文件 #include <iostream> #pragma comment (lib, "libTest.lib") //连接.lib文件 using namespace std;
{ fPrintFun();
cout << "输入两个参数, 15" << endl;
cout << "AddFun(12, 15):" << fAddFunc(12, 15) << endl;
cout << "MaxFun(12, 15):" << fMaxFunc(12, 15) << endl;
HINSTANCE hInstance = LoadLibraryA("dllTest.dll");//加载
动态库 if(NULL == hInstance) { cout << "Error" << endl; FreeLibrary(hInstance); } else { fAddFunc = (pAddFunc)GetProcAddress(hInstance,

静态库和动态库编译

静态库和动态库编译

静态库和动态库编译静态库和动态库是编程中常用的两种库文件形式,本文将介绍它们的编译过程和使用方法。

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 参数的含义同静态库。

C语言程序静态库和动态库的创建及其应用

C语言程序静态库和动态库的创建及其应用

首页 新手入门 Linux编程 系统管理 网络管理 Linux认证 Unix/BSD Linux数据库 Linux集群 Linux手册 Linux下载 论坛 专题 RSS
您现在的位置: 中国IT实验室 >> Linux >> Linux编程 >> CC编程 >> 文章正文
C语言程序静态库和动态库的创建及其应用
#endif
Google 提供的广告
[1] [2] 下一页
【责编:Yoyo】
相关文章
Linux操作系统下C语言编程的注意事项 Linux系统下的C语言开发都需要学些什么 编写可移植C/C++程序的要点 linux操作系统下c语言编程入门--线程操作 LINUX动态链接库高级应用 在Linux中创建静态库和动态库 Linux操作系统下动态库的生成及链接方法 关于Linux静态库和动态库的分析 Linux编程新手入门 C语言中的移位操作 新手看招 Unix和Linux下C语言学习指南
桓文ccna,ccnp包过班开课 微软MCSE 2003火爆招生 特价:CCNA ¥600元(学生) CCNA+CCNP报名学生仅需4500 微软认证系统工程师MCSE ACCP国际软件工程师 ACCP软件工程师国际认证 CIW认证网页设计师
¥4400 ¥4000 ¥600 ¥4500 ¥2200 ¥20910 ¥4500 ¥900
关于我们 | 广告服务| 成功客户 | 合作媒体 | 网站历史 | 联系我们 | 招聘信息 | 免责声明 拓普思信息科技有限公司(北京·深圳) 北京运营中心:北京市海淀区中关村南大街9号理工科技大厦2107室 服务电话:86-10-85655622 深圳研发中心:深圳市福田保税区英达利科技数码园C座710 培训咨询:400-700-5807 网校服务:86-755-82044560(12线) 2004商业网站100强 2005中国BBS社区100强 2005消费者最喜爱的网站 TOP100 中国IT实验室 版权所有 Copyright © 2001 - 2008 All Rights Reserved 《中华人民共和国电信与信息服务业务经营许可证》编号:粤ICP备05089709 常年法律顾问:郑凡律师

动态库和静态库的制作过程

动态库和静态库的制作过程

动态库和静态库的制作过程我们通常把一些公用函数制作成函数库,供其它程序使用。

函数库分为静态库和动态库两种。

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

本文主要通过举例来说明在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语言程序静态库和动态库的创建及其应用

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中动态链接库和静态链接库的生成与调用

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下静态库和动态库(共享库)的制作与使用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:感谢大家的阅读,本文由我司收集。

第三阶段学习总结,静态库和动态库的创建和使用C 篇

第三阶段学习总结,静态库和动态库的创建和使用C  篇

利用以上代码和文件创建动态库: g++ -fpic -shared -o libmyfun.so fun1.o fun2.o fun3.o 其中: -fpic 使输出的对象模块是按照可重定位地址方式生成的。 -shared 指定把对应的源文件生成对应的动态链接库文件 libmyfun.so 文件。下面看一下如何 使用对应的动态链接库。 g++ -o somyfuntest main.cpp -L . -lmyfun 与静态库的利用不同的是,在默认情况下,当程序运行时,系统会搜索/lib 和/usr./lib 库,如果连接库没有存在这两个目录下,系统将不能找到链接库,程序会终止运行。所以, 一般情况下我们需要手动的添加路径或者更改 LD_LIBRARY_PATH 的环境变量。 前者,我们需要把当前生成的动态库的路径加到/usr/local/lib 下面。我一般情况下习惯 于用后一种方法,我习惯于这样做,export LD_LIBRARY_PATH=$PWD,然后我们就可 以执行可执行文件 somyfuntest 了。 库函数就简单介绍到这里,想了解更深尚需时日。“冰冻三尺非一日之寒”,对嵌入式的 学习非一朝一日所能完成的,短短的几个月,时间之紧迫,内容之丰盛,尚需多反馈总结啊!
#include"head.h" int main() { fun1(); fun2(); fun3();
return 0; }
利用以上的代码和文件创建静态库:
利用 G++生成对应目标文件: g++ –c fun1.c fun2.c fun3.c 如果对应的文件没有错误,g++会对文件进行编译生成 fun1.o、fun2.o 和 fun3.o 三个目标 文件(相当于 windows 下的 obj 文件)。然后用 ar 创建一个名字为 libstr.a 的库文件,并把 fun1.o、fun2.o 和 fun3.o 内容插入到对应的库文件中。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件:PC机操作系统linux
三、实验内容
进入/up-techpxa270/exp/basic/03_tty/host,里面有如下文件:
host_serial host_serial.c serial.c serial.h
(1)将串口设置文件serial.c单独封装成动态库。
(2)使用动态库编译生成host_serial应用程序,验证动态库的正确性
五、分析与讨论
1.如果制作好的动态库不拷贝到/usr/lib,而是放在当前目录,这种情况下怎样使用该动态库?
加入库所在的路径
2.如何在目标机使用动态、静态库?
六、教师评语
签名:
日期:
成绩
《嵌入式系统软件设计》实验报告
实验序号:03实验项目名称:动态库和静态库的制作和使用
学 号
1307142225
姓 名
林燕萍
专业、班
软件工程技术2班
实验地点
实1#318
指导教师
实验时间
一、实验目的
1.熟悉linux的编译方法
2.掌握动态库、静态库的制作和使用。
二、实验设备(环境)及要求
硬件:PC机;PXA270试验箱
(3)将串口设置文件单独封装成静态库。证动态库的正确性
四、实验步骤
(1)将串口设置文件serial.c单独封装成动态库。
(2)使用动态库编译生成host_serial应用程序,验证动态库的正确性
(3)将串口设置文件单独封装成静态库。
(4)使用静态库编译生成host_serial应用程序,验证动态库的正确性
相关文档
最新文档