歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 編譯生成動態庫及鏈接動態庫

編譯生成動態庫及鏈接動態庫

日期:2017/3/3 14:13:47   编辑:Linux技術

源文件和Makefile准備dync.c dync.h Makefile test.c

cat dync.c#include <stdlib.h>

#include <stdio.h>

#include "dync.h"

void dync_print ()

{

printf ("Here call from dync lib function;\n");

}

cat dync.h #ifndef __DYNC_H__

#define __DYNC_H__

void dync_print ();

#endif /* __DYNC_H__ */

cat test.c

#include "dync.h"

int main ()

{

dync_print ();

return 0;

}

cat Makefile APP_DIR = /home/hu/Templates/dync_test/dync.ci

LIB_DIR = /home/hu/Templates/dync_test/lib

LIB_SRC = dync.c

LIB_INC = dync.h

LIB_OBJ = dync.o

LIB = libdync.so

APP_SRC = test.c

APP_OBJ = test.o

APP_BIN = test

CC = gcc

SHARED = -shared -o

FPIC = -fPIC -c

$(shell mkdir -p $(LIB_DIR))

all:$(LIB) $(APP_BIN)

$(LIB):$(LIB_OBJ)

$(CC) $(LIB_OBJ) $(SHARED) $(LIB)

mv $(LIB) $(LIB_DIR)

$(LIB_OBJ):$(LIB_SRC) $(LIB_INC)

$(CC) $(FPIC) $(LIB_SRC)

$(APP_BIN):$(APP_OBJ)

$(CC) $(APP_OBJ) -L$(LIB_DIR) -ldync -o $(APP_BIN)

$(APP_OBJ):$(APP_SRC)

$(CC) -c $(APP_SRC)

clean:

rm -rf $(LIB_DIR) *.o test

因為默認的lib路徑沒有我們臨時定義的,所以可以通過命令臨時設定環境變量,命令如下:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hu/Templates/dync_test/lib

執行的效果:make

gcc -fPIC -c dync.c

gcc dync.o -shared -o libdync.so

mv libdync.so /home/hu/Templates/dync_test/lib

gcc -c test.c

gcc test.o -L/home/hu/Templates/dync_test/lib -ldync -o test

./test

Here call from dync lib function;

注意的地方:編譯庫源文件的時候,必須使用-fPIC選項編譯,否則目標文件沒用動態庫的效果, 生成的時候使用-shared。

鏈接動態庫使用-L$(LIB_DIR) -ldync, -L後緊跟動態庫所在路徑, -ldync是-l後面緊跟動態庫去掉lib頭和.so擴展名的內容。

建議Makefile裡面的路徑使用絕對路徑。

Copyright © Linux教程網 All Rights Reserved