zoukankan      html  css  js  c++  java
  • 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文件中完成对动态连接库的链接过程,无需在源文件中去处理;

  • 相关阅读:
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & ManacherK
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher I
    pat 1065 A+B and C (64bit)(20 分)(大数, Java)
    pat 1069 The Black Hole of Numbers(20 分)
    pat 1077 Kuchiguse(20 分) (字典树)
    pat 1084 Broken Keyboard(20 分)
    pat 1092 To Buy or Not to Buy(20 分)
    pat 1046 Shortest Distance(20 分) (线段树)
    pat 1042 Shuffling Machine(20 分)
  • 原文地址:https://www.cnblogs.com/huochangjun/p/2670539.html
Copyright © 2011-2022 走看看