makefile学习经验(三)----编译生成动态库文件(方式一)

Lunix下生成动态库文件:

         之前已经介绍了.o,.a,.so文件类型的含义,.so后缀的文件是动态库文件。

        下面介绍在编译过程中链接到动态库文件的方法:

一.   源码文件:

so_test.h:

void test_a();

void test_b();

void test_c();

 

test_a.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_a...\n");

}

 

test_b.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_b...\n");

}

 

test_c.c:

#include "so_test.h"

void test_a()

{

    printf("this is in test_c...\n");

}

 

test.c:

#include "so_test.h"

int main()

{

test_a();

test_b();

test_c();

return 0;

}

 

二.Makefile文件:

#*****************************************************************************

# Copyright        :  

#

# Author           :   huochangjun

# Date             :   2012-08-16

# Version           :   Demo1 动态链接库

# Description             :   Demo

#

#****************************************************************************/

 

SHELL = /bin/sh

 

LIB_DIR = /cbs/lhbb/hcj/dy2/lib/

BIN_DIR = /cbs/lhbb/hcj/dy2/bin/

OBJECT_DIR = /cbs/lhbb/dy2/test/obj/

APP_DIR = /cbs/lhbb/hcj/dy2/testapp/

 

$(shell mkdir -p ${LIB_DIR})

$(shell mkdir -p ${BIN_DIR})

$(shell mkdir -p ${OBJECT_DIR})

 

RM = rm -fr

#****************************************************************************

 

CC = gcc

SHARED = -shared -o

FPIC = -fPIC -c

 

SRC_OBJECT = $(APP_DIR)test_a.c $(APP_DIR)test_b.c $(APP_DIR)test_c.c

H_OBJECT = $(APP_DIR)so_test.h

OBJECT = test_a.o test_b.o test_c.o

 

DY_SRC_OBJECT = $(APP_DIR)test.c

DY_OBJECT=test.o

 

LIB_OBJECT = libtest.so

BIN_OBJECT = test

 

#****************************************************************************

 

.PHONY:all

all:$(LIB_OBJECT) $(BIN_OBJECT)

 

$(LIB_OBJECT):$(OBJECT)

        $(CC) $(OBJECT) $(SHARED) -fPIC -o $(LIB_OBJECT)

        mv $(LIB_OBJECT) $(LIB_DIR)

 

$(OBJECT):$(SRC_OBJECT) $(H_OBJECT)

        $(CC) $(FPIC) $(SRC_OBJECT)

 

$(BIN_OBJECT):$(DY_OBJECT)

        $(CC) $(OBJECT_DIR)$(DY_OBJECT) -L$(LIB_DIR) -ltest -o $(BIN_OBJECT)

        mv $(BIN_OBJECT) $(BIN_DIR)

 

$(DY_OBJECT):$(DY_SRC_OBJECT)

        $(CC) -c $(DY_SRC_OBJECT)

 

        mv $(OBJECT) $(DY_OBJECT) $(OBJECT_DIR)

 

clean:

        $(RM) $(LIB_DIR) $(BIN_DIR) $(OBJECT_DIR)

 

三.makefile文件的简单阐述:

基本的变量赋值在生成静态库文件已经介绍了,这边就不再重复了。

 

和静态库文件的生成不同的是,编译的命令不同:

1.$(CC) $(OBJECT) $(SHARED) -fPIC -o $(LIB_OBJECT)

----这边$(SHARED)变量是:-shared –o 是编译动态库必须使用的;

  -fPIC 编译位置独立的代码,任何位置可以使用,达到共享内存;

 

2. $(CC) $(OBJECT_DIR)$(DY_OBJECT) -L$(LIB_DIR) -ltest -o $(BIN_OBJECT)

---- -L$(LIB_DIR) –ltest:ltest是固定的,取生成的动态库文件文件名去掉lib和后缀,然后加上l,这行命令就是在目录下寻找动态库文件,链接上动态库文件;

 

四.查看可执行文件是否链接上动态库文件:

执行make后,生成的目录结构和静态库文件一样,此时用命令ldd libtest.so查看是否链接上动态库文件:

libtest.so =>not found:显示这样的结果说明可执行文件没有链接上动态库文件,现在有如下两种方式去处理:

  1. 用root用户登陆环境,进入etc目录,在ld.so.conf文件后增加你要链接的路径,然后执行ldconfig即可,这样修改后,你目录下的动态库文件就是全局的,而非个人环境中的;
  2. 修改个人环境中的.cshrc文件,在文件中设定共享目录:

  setenv LD_LIBRARY_PATH /cbs/lhbb/hcj/dy2/lib:${LIBPATH};

  这样在每次登陆你的个人环境的时候,才会将LD_LIBRARY_PATH重新赋值,影响的仅仅是你的个人环境;

 

五.以上的方式是在makefile文件中完成对动态连接库的链接过程,无需在源文件中去处理;

 

posted on 2012-09-04 15:58  Kimi_jun  阅读(22584)  评论(0编辑  收藏  举报

导航