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

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

转载于:https://www.cnblogs.com/jiangu66/p/3155588.html

autotools入门笔记(二)——创建和使用静态库、动态库相关推荐

  1. MySql入门笔记二~悲催的用户

    这些是当年小弟的MySql学习笔记,木有多么复杂的结构操作,木有多炫丽的语句开发,木有...总之就是木有什么技术含量... 日复一日,彪悍的人生伴随着彪悍的健忘,运维操作为王,好记性不如烂笔头,山水有 ...

  2. Linux学习---静态库 动态库

    今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用E ...

  3. 软件库Library之静态库\动态库和静态加载\动态加载

    软件库Library之静态库\动态库和静态加载\动态加载 动态库之导入库 https://blog.csdn.net/wallaceli1981/article/details/5740718 * 动 ...

  4. Linux-(C/C++)生成并使用静态库/动态库

    静态库/动态库概要 在Windows下静态库的后缀为:.lib.动态库后缀为:.dll:而在Linux下静态库的后缀为:.a.动态库的后缀为:.so. 那么什么是静态库呢? 首先我们来看看程序编译的大 ...

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

    0. 引言 UNIX是一个注册商标,是要满足一大堆条件并且支付可观费用才能够被授权使用的一个操作系统.linux是unix的克隆版本,是由其创始人Linus和诸多世界知名的黑客手工打造的一个操作系统. ...

  6. NDK01-打包静态库 动态库在mk和cmake环境配置使用

    动态库和静态库 动态库: libxxx.so 运行的时候,才会去加载,加载一次就在内存中存在副本,其他地方使用就都是公用的.使用场景就是 高德百度sdk对外开房 静态库: libxxx.a 编译期把静 ...

  7. 【win32】day11-windows的库/静态库/动态库

    Windows的库 由于项目的复杂程度,或者为了提高代码的 重用率等等,所以才引入了库程序. 库包含两种: 1 静态库:扩展名为LIB的文件,是不能被 加载的程序,可以理解为目标程序的 归档. 2 动 ...

  8. 机器学习入门 笔记(二) 机器学习基础概念

    第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...

  9. 海思入门笔记二:HiBurn工具实现镜像烧写

    这里写自定义目录标题 海思入门笔记:HiBurn工具实现镜像烧写 第一步:裸板可使用串口先烧录boot(速度慢) 第二步:已烧好boot的板子,可使用USB快速烧录 海思入门笔记:HiBurn工具实现 ...

最新文章

  1. Javascript鼠标滚轮事件兼容写法
  2. AAAI 独家 | 腾讯AI Lab 现场陈述论文:使众包配对排名聚合信息最大化的 HodgeRank
  3. ACCESS 文本文件导入和导出指定字段类型的方法
  4. 2021年中国机器视觉市场研究报告
  5. 远程主机访问mysql权限_如何给远程主机开启mysql远程登录权限
  6. 小程序--计算正负数个数
  7. java 获取所有线程,Java 实例 - 获取所有线程
  8. 对于已有的【寄存】代码,【式样】变更,【参照】其他代码修正时的注意事项!
  9. RedHat 7通过yum安装图形界面
  10. java 1.6 jre 下载_jre1.6下载-Java环境 官方版 - 安下载
  11. X509Certificate证书如何获取16位长度serial number?
  12. bottleneck resnet网络_ResNet网络结构分析
  13. java验证码问题(不区分大小写)
  14. web网站整体变灰色仅仅需要两行代码
  15. 【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳
  16. Windows获取本地安装软件详细信息(对标卸载程序控制面板)
  17. 准备半年,面试2个月,上岸快手拿个35K应该不算高吧?
  18. C# 阿里云短信接口调用(不使用SDK,单文件完成)
  19. TS高级类型 Record、Pick、Partial、Required、Readonly、Exclude、Extract、Omit、NonNullable 使用
  20. 支持向量机SMO算法

热门文章

  1. Google的投票站点在用Asp.net
  2. “docker-app”实用工具分享,大大提高 Compose 文件复用率
  3. 智慧城市这份试卷 国外城市怎么答题?
  4. highcharts 显示网格
  5. 如何分割合并ISO文件
  6. Linux下遍历目录下的文件
  7. 易盛极星期货量化教学
  8. 输入流与输出流的区别
  9. linux删除文件操作
  10. 五分钟实现SpringBoot快速入门