20170725Linux下Makefile之三_动态链接库与静态链接库

Linux下Makefile之三_动态链接库与静态链接库

1.基础介绍

动态链接库:lib*.so,区别与Windows中的*.dll,边执行边调用函数,依赖于外部库函数,函数修改不影响动态函数库的升级。

静态链接库:lib*.a,提前进行了函数库编译,包含了所有静态函数库的编译,编译后的执行程序不需要依赖于外部函数库,但是一旦函数库有些许改动就要重新编译。

2.文件prog.c 、code.c、code.h

prog.c

#include <stdio.h>
#include "code.h"
int main(void)
{
    int i = 1;      
    printf ("myfun(i) = %d\n", myfun(i));
}


code.c

#include "code.h"
int myfun(int in)
{
    return in + 1;
}


code.h

extern int myfun(int);

3、生成和调用动态链接库libcode.so

3.1生成攻台链接库libcode.so,编写makefile文件

CC:=gcc
LIBS:=
OBJS:=prog.o code.o
LDFLAGS:=
DEFINES:=
INCLUDE:=-I
CFLAGS:=
CXXFLAGS:=
#link parameter
LIB :=liscode.so
#link
${LIB}:code.o
${CC} -shared -o -fPIC -o [email protected] $^
#compile
code.o:code.c
${CC} -c -fPIC $^ -o [email protected]
#clean
clean:
rm -f test ${OBJS} ${LIB}


3.2调用动态链接库libcode.so

Makefile有三个非常有用的变量。分别是[email protected],$^,$<代表的意义分别是:
[email protected]目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

使用动态链接库,Makefile文件如下:

prog:
gcc prog.c -I. -L. -o prog -lcode

clean:
rm -f test ${OBJS} ${LIB}


这里不分是动态的还是静态的,但是,如果使用动态链接库,运行时需要将libcode.so文件拷贝到/usr/lib下,静态库则不需要。

运行程序如果提示找不到xxx.so,敲以下命令即可:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH      // 把当前目录加入到库文件搜索目录环境变量,当时的错误提示如下:


4.生成和调用静态链接库

4.1生成静态链接库libcode.a

#######################
#静态链接库生成的 Makefile
# #######################
#
# # compile and lib parameter
CC      := gcc
LIBS    :=
OBJS    :=prog.o code.o
LDFLAGS := 
DEFINES :=
INCLUDE := -I.
CFLAGS  := 
CXXFLAGS:= 
#
# # link parameter
AR  := ar
LIB := code.a
#
# #link
$(LIB):code.o
$(AR) -r [email protected] $^
#     #compile
code.o:code.c
$(CC) -c $^ -o [email protected] 
clean:
rm -f test ${OBJS}


4.2调用静态链接库libcode.a

使用静态链接库,Makefile文件如下:

prog:
gcc prog.c -I. -L. -o prog -lcode

clean:
rm -f test ${OBJS} ${LIB}


这里不分是动态的还是静态的,但是,如果使用动态链接库,运行时需要将libcode.so文件拷贝到/usr/lib下,静态库则不需要。