天天看點

20170725Linux下Makefile之三_動态連結庫與靜态連結庫Linux下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}

20170725Linux下Makefile之三_動态連結庫與靜态連結庫Linux下Makefile之三_動态連結庫與靜态連結庫

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      // 把目前目錄加入到庫檔案搜尋目錄環境變量,當時的錯誤提示如下:

20170725Linux下Makefile之三_動态連結庫與靜态連結庫Linux下Makefile之三_動态連結庫與靜态連結庫

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}

20170725Linux下Makefile之三_動态連結庫與靜态連結庫Linux下Makefile之三_動态連結庫與靜态連結庫

4.2調用靜态連結庫libcode.a

使用靜态連結庫,Makefile檔案如下:

prog:

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

clean:

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

這裡不分是動态的還是靜态的,但是,如果使用動态連結庫,運作時需要将libcode.so檔案拷貝到/usr/lib下,靜态庫則不需要。

20170725Linux下Makefile之三_動态連結庫與靜态連結庫Linux下Makefile之三_動态連結庫與靜态連結庫

繼續閱讀