编写库函数和Makefile

一.什么是库函数:
C语言中有一些函数会执行一些标准任务,可以事先对这些函数进行编译,然后将他们放置在一些特殊的目标代码文件中,这些目标代码文件称为库,库文件中的函数可以通过连接程序与应用程序进行链接,这样就不用在每次执行程序时都对这些通用的函数进行编译了。
标准的C函数库名称为libc,包含了诸如内存管理或者输入输出操作的基本函数,这些库放置在/usr/lib下,系统中的任何用户都可以利用这些库函数,用户也可以自己建立库。
库的两种形式:静态库;共享库(动态库)
二.静态库/动态库:
1)基本概念:
静态库又称为文档文件(Archive File)。它是多个.o文件的集合。Linux中静态库文件的后缀为".a"。
静态库的代码在编译时就已经链接到应用程序中
静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。
使用"ar"工具维护和管理静态库
2)如何建立和使用静态库
看下面的例子,包含四个文件test.c test.h main.c Makefile:
1. 编写源文件 
test.c
# include "test.h"
# include <stdio.h>

void mystrcpy(char *des, const char *src)
   while (*des++ = *src++);
}

int mysum(int a, int b)
{
    int sum = a + b;
    return sum; 
}

void myshow(int* arrary ,int len)
{
    for (int i = 0; i < len; i++)
    {
        printf ("%d ",arrary[i]);
    }
    printf("\n");
}
test.h
#ifndef TEST_H_
#define TEST_H_
# include <stdio.h>

void mystrcpy(char *des, const char *src);
int mysum(int a, int b);
void myshow(int* arrary ,int len);

#endif

编写测试代码:
main.c
# include "test.h"

int main()
    {
    char a[10] = "abcdef";
    char b[10] = "\0";
int c = 50;
int d = 11;
    mystrcpy(b,a);
    int e = d + c;
    printf ("b : %s\n",b);
printf ("e : %d\n",e);
    return 0; 
    }
编写Makefile:
file :a.out b.out

test.o:test.c
gcc -o $@ -c $^
test.a:test.o 
ar rcs $@ $^
rm -rf test.o
a.out:main.c test.a
gcc -o $@ main.c ./test.c -ldl
libtest.so:test.c
gcc -o $@ -fPIC -shared $^
b.out:main.c libtest.so
gcc -o $@ main.c -L ./ -ltest -ldl 

clean:
rm -rf a.out b.out test.o
clean1:
rm -rf a.out b.out test.o test.a libtest.so
说明:
ar的三个参数中:r代表将文件插入归档文件中,c代表建立归档文件,s代表若归档文件中包含了对象模式,可利用此参数建立备存文件的符号表。
lib和.a都是系统指定的静态库文件的固定格式,test才是静态库的名称,编译时,链接器会在标准路径(/usr/lib;/lib)或者用户指定的路径下去找.a的文件。
使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接
用make编译所有文件,make clean/clean1 执行删除操作 
$@代指冒号前内容,$^代指冒号后内容,冒号前是要生成的文件,之后是被依赖的文件
使用静态库可以使程序不依赖于任何其他库而独立运行,但是会占用很多内存空间以及磁盘空间,而且如果库文件更新,则需重新编译源代码,使用起来不够灵活。
a.out 比 b.out 大,是因为静态库是在编译时把所有库文件拷贝到可执行文件中,而动态库则是按需拷贝,比如show()函数没有用到,就不再拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值