文件的操作与动态(静态)库的打包

一、文件的操作:(open、read、write、close)

程序代码:

1)读文件

[chaiyandong@localhost linux_work]$ cat read.c

//读文件
#include<stdio.h>
#include<string.h>


//主函数
int main(){
FILE* fp = fopen("myfile","r");
if(!fp){
printf("fopen error!\n");
}
char buf[1024];
const char *msg = "hello world\n";
while(1){
//注意返回值和参数,此处有陷阱,仔细查看man守则关于该函数到说明
ssize_t s = fread(buf,1,strlen(msg),fp);
if(s>0){
buf[s] = 0;
printf("%s",buf);
}
if(feof(fp)){
break;
}
}
fclose(fp);
return 0;

}

2)写文件

[chaiyandong@localhost linux_work]$ cat write.c
//写文件
#include<stdio.h>
#include<string.h>


int main(){
//文件到打开
FILE *fp = fopen("myfile","w");
if(!fp){
printf("fopen error\n");
}
const char*msg = "hello world\n";
int count = 5;
while(count--){
fwrite(msg,strlen(msg),1,fp);
}
//文件到关闭
fclose(fp);
return 0;
}

二、动态(静态)库的打包:

1)静态库(.a):程序在编译链接的时候把库的代码连接到可执行文件中。程序运行的时候将不再需要静态库。

2)动态库(.so):程序在运行时候才去链接动态库的代码,多个程序共享使用库的代码。

3)一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目录文件的整个机器码。

4)在可执行文件开始以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接。

5)动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被用到该库的所有进程共用,节省了内存和磁盘空间。

测试代码:

(1)#include"add.h"

int add(int a,int b){
return a+b;

}


(2)#ifndef __ADD_H__
#define __ADD_H__
int add(int a,int b);
#endif   //__ADD_H__


(3)#include"sub.h"

int sub(int a,int b){

return a-b;
}


(4)#ifndef __SUB_H__

#define __SUB_H__
int sub(int a,int b);
#endif   //__SUB_H__

生成静态库:(示例)

[chaiyandong@localhost linux_work]$ ls

add.c  add.h  add.o  a.out  lib.c  main.c  makefile  myfile  myshell1.c  myshell.c  pipe.c  read.c  sub.c  sub.h  sub.o  work4r  write.c
[chaiyandong@localhost linux_work]$ ar -rc libmymath.a add.o sub.o
[chaiyandong@localhost linux_work]$ ls
add.c  add.h  add.o  a.out  lib.c  libmymath.a  main.c  makefile  myfile  myshell1.c  myshell.c  pipe.c  read.c  sub.c  sub.h  sub.o  work4r  write.c

查看静态库中的目录列表:

[chaiyandong@localhost linux_work]$ ar -tv libmymath.a
rw-rw-r-- 500/500    683 Apr 10 01:24 2018 add.o
rw-rw-r-- 500/500    687 Apr 10 01:24 2018 sub.o

生成动态库:

1)shared:表示生成共享库格式。

2)fPIC:产生位置无关码(position independent code)。

3)库名格式:lib***.so

示例:

[chaiyandong@localhost lib.c]$ ls
add.c  add.h  main  main.c  sub.c  sub.h
[chaiyandong@localhost lib.c]$ gcc -fPIC -c sub.c add.c
[chaiyandong@localhost lib.c]$ gcc -shared -o libmymath.so add.o sub.o
[chaiyandong@localhost lib.c]$ ls
add.c  add.h  add.o  libmymath.so  main  main.c  sub.c  sub.h  sub.o


阅读更多
个人分类: 操作系统
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭