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里面的路径使用绝对路径。