带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的。只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文件时需要对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!\n");
}

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。

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

autotools入门笔记(二)——创建和使用静态库、动态库的更多相关文章

  1. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  2. windows库的创建和使用:静态库+动态库

    windows库的创建和使用:静态库+动态库   一.静态库的创建和使用 1. 静态库创建 (1)首先创建projecttest,測试代码例如以下: 1) test.h void test_print ...

  3. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  4. Linux中创建和使用静态库&动态库

    库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...

  5. C/C++ 跨平台交叉编译、静态库/动态库编译、MinGW、Cygwin、CodeBlocks使用原理及链接参数选项

    目录 . 引言 . 交叉编译 . Cygwin简介 . 静态库编译及使用 . 动态库编译及使用 . MinGW简介 . CodeBlocks简介 0. 引言 UNIX是一个注册商标,是要满足一大堆条件 ...

  6. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  7. 静态库动态库的编译、链接, binutils工具集, 代码段\数据段\bss段解释

    #1. 如何使用静态库 制作静态库 (1)gcc *.c -c -I../include得到o文件 (2) ar rcs libMyTest.a *.o 将所有.o文件打包为静态库,r将文件插入静态库 ...

  8. 生成lua的静态库.动态库.lua.exe和luac.exe

    前些日子准备学习下关于lua coroutine更为强大的功能,然而发现根据lua 5.1.4版本来运行一段代码的话也会导致 "lua: attempt to yield across me ...

  9. C++开发新版本vs使用旧版本vs编译的静态库动态库

    关于vs潜在的升级问题概述 (Visual C++)查看官网的介绍:潜在的升级问题概述 (Visual C++).主要问题: 1. 如果使用 /GL(全程序优化)进行编译,则生成的对象文件只能使用生成 ...

随机推荐

  1. Installshield停止操作系统进程的代码 --IS6及以上版本适用

    原文:Installshield停止操作系统进程的代码 --IS6及以上版本适用 setup.rul的代码 Code;end;///////////////////////////////////// ...

  2. 快速构建Windows 8风格应用30-应用生命周期管理

    原文:快速构建Windows 8风格应用30-应用生命周期管理 引言 Windows 8 中可以启动多个应用并在其中切换,我们没有必要担心降低系统速度或消耗电池电量. 因为系统会自动挂起(有时会终止) ...

  3. 如何查找Linux的函数定义的位置?

    网上的许多站点提供这样的服务,如下面这个: http://lxr.free-electrons.com/ident?v=3.10 Linux的错误返回值:3.10版本 Linux/include/ua ...

  4. Redis源代码分析(二十四)--- tool工具类(2)

    在上篇文章中初步的分析了一下,Redis工具类文件里的一些使用方法,包含2个随机算法和循环冗余校验算法,今天,继续学习Redis中的其它的一些辅助工具类的使用方法.包含里面的大小端转换算法,sha算法 ...

  5. Mysql高级之索引

    原文:Mysql高级之索引 索引:是针对数据所建立的目录. 作用: 可以加快查询速度 负面影响: 降低了增删改的速度. 索引的创建原则: 1:不要过度索引 2:在where条件最频繁的列上加.在重复度 ...

  6. webapp 开发调试测试方法总结

    好久都没有发表过日志了,反正近期项目也已经接近尾声了,那么是时候该总结一下在项目中用到的技术了,请看:这里先废话几句,我们现在的开发模式是这样子的:先把本地的网页上传到远程服务器(因为好多设备都要去访 ...

  7. NodeJS热部署工具 — supervisor

    NodeJS热部署工具 — supervisor 大家都在开发nodejs应用时遇到过这样的情况,修改nodejs应用中的程序文件后必须重启nodejs才能重新加载应用代码.这是因为nodejs加载过 ...

  8. Windows Server 服务器安全配置

    Windows Server 服务器安全配置 好吧,我标题党了.我只了解一些基本的安全配置.如果你是大湿,请绕道或者给予我严厉的批评让我进步谢谢. 编辑这篇文章用的编辑器编辑的,当我单击查看的时候发现 ...

  9. API变了,客户端怎么办?

    使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[九]——API变了,客户端怎么办? 系列导航地址http://www.cnblogs.com/fzrain/p/3490137 ...

  10. iOS基础 - KVC and KVO

    一.KVC(key value coding) 我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu setAge:10];  stu.age = 9; KVC ...