编译生成动态库及链接动态库

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值