源文件和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裡面的路徑使用絕對路徑。