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下,靜态庫則不需要。