• autotools入门笔记(二)——创建和使用静态库、动态库


    带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的。只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文件时需要对configure.in和Makefile.am文件进行修改。

    下面以工程libtest为例说明gcc创建和使用静态库、动态库的过程,libtest目录结构和内容如图1所示,其中三个文件hello.h,hello.c和main.c的内容如下。

     

    图1

    libtest/include/hello.h

    #ifdef _HELLO_H_
    #define _HELLO_H_
    
    void hello();
    
    #endif

    libtest/lib/hello.c

    #include "hello.h"
    #include <stdio.h>
    void hello()
    {
    	printf("hello world!
    ");
    }

    libtest/src/main.c

    #include "hello.h"
    int main()
    {
    	hello();
    }

    使用静态库

    构建的步骤在上一节中已经详细说明,这里不再赘述,这里与上一节不同的地方是configure.in和Makefile.am文件,这里说说这两个文件怎么编写。

    (1)lib/configure.in文件其他内容与上一节一样,只需要在# Checks forlibraries后面增加一行内容:AC_PROG_RANLIB,表示构建当前目录时需要生成静态库文件。lib/configure.in文件的完整内容如图2所示:


    图2

    (2)lib/Makefile.am是个关键文件,内容如图3所示:


    图3

    说明:noinst_LIBRARIES=libhello.a表示生成静态库文件libhello.a;libhello_a_SOURCES定义库文件libhello.a的源文件列表。

    根据上一节中的步骤进行构建过程,完成后将会在lib目录中生成静态库文件libhello.a。

    (3)src/configure.in跟上一节一样,没有需要特殊变动的。

    (4)src/Makefile.am是个关键文件,内容如图4所示:


    图4

    说明:noinst_PROGRAMS=main表示生成可执行程序main;main_LDADD=../lib/libhello.a表示为main程序添加库文件../lib/libhello.a,gcc进行链接过程时将会链接该静态库。

    根据上一节中的步骤进行构建过程,完成后将会在src目录中生成可执行程序main。

    使用动态库

    (1)lib/configure.in中在# Checks for libraries后面增加一行内容:AC_PROG_LIBTOOL,表示构建当前目录时需要生成动态库文件。lib/configure.in文件的完整内容如图5所示:


    图5

    (2)lib/Makefile.am是个关键文件,内容如图6所示:


    图6

    说明:lib_LIBRARIES=libhello.la表示生成动态库文件libhello.la;libhello_la_SOURCES定义库文件libhello.la的源文件列表。

    根据上一节中的步骤进行构建过程,完成后将会在lib目录中生成静态库文件libhello.la。

    (3)src/configure.in跟上一节一样,没有需要特殊变动的。

    (4)src/Makefile.am是个关键文件,内容如图7所示:


    图7

    说明:main_LDADD=../lib/libhello.la表示为main程序添加动态库文件../lib/libhello.la。

    (5)这里与静态库方法不同的是,动态库文件需要安装(我测试了一下,好像不安装也可以的),安装方法:

            a)  环境变量LD_LIBRARY_PATH指示动态连接器可以装载动态库的路径,在链接动态库文件前设置该变量为库文件所在路径,注意:用export LD_LIBRARY_PATH=”…”方式只是临时生效的,如果要永久有效可以写入~/.bashrc文件中,跟修改PATH类似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。

            b) 当然如果有root权限的话,也可以修改/etc/ld.so.conf文件,将要添加的动态库搜索路径写入该文件中,然后调用/sbin/ldconfig来达到同样的目的。

    根据上一节中的步骤进行构建过程,完成后将会在src目录中生成可执行程序main。


    突然觉得我自己好啰嗦,这么简单的东西写的这么复杂,汗。。。


  • 相关阅读:
    2018-2019-2 20165331《网络对抗技术》Exp 8 Web基础
    2018-2019-2 20165331《网络对抗技术》Exp7 网络欺诈防范
    2018-2019-2 20165331《网络对抗技术》Exp6 信息搜集与漏洞扫描
    2018-2019-2 20165331《网络对抗技术》Exp5 MSF基础应用
    2018-2019-2 20165331《网络对抗技术》Exp4 恶意代码分析
    2018-2019-2 20165331《网络对抗技术》Exp3 免杀原理与实践
    2018-2019-2 20165331《网络对抗技术》Exp2 后门原理与实践
    2018-2019-2 20165331《网络对抗技术》Exp1 PC平台逆向破解
    2018-2019-2《网络对抗技术》Exp0 Kali安装 Week1
    2018-2019-2 网络对抗技术 20165237 Exp9 Web安全基础实践
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3155588.html
Copyright © 2020-2023  润新知