使用 GNU Libtool 创建库
发布日期:2021-05-07 21:03:45 浏览次数:19 分类:精选文章

本文共 2895 字,大约阅读时间需要 9 分钟。

GNU Libtool 文档

一、Libtool 介绍

Libtool 是 GNU 项目的重要工具之一,主要用于处理动态和静态链接库的创建与管理。它通过隐藏系统间链接库的差异,为开发者提供了统一的接口,极大地简化了跨平台开发中的复杂性。

1.1 Libtool 的作用

Libtool 的主要目标是解决不同系统间创建动态链接库的复杂性。传统的做法需要深入研究每个系统的文档,并手动修改 Makefile,这种方法繁琐且容易出错。Libtool 则通过抽象层隐藏了这些差异,使得开发者无需深入了解系统细节,只需掌握 Libtool 的使用方法即可。

Libtool 还可以创建静态链接库或同时包含动态和静态链接库。它能够适应各种系统环境,只要系统支持动态链接库即可。

1.2 Libtool 的特性

虽然 Libtool 提供了统一的接口,但它仍需依赖底层系统的支持。例如,无法在不支持动态链接库的系统上创建动态链接库。因此,Libtool 的使用前提是目标系统必须支持动态链接库。

二、Libtool 基本用法

本节将通过实例说明如何使用 Libtool 从源代码创建链接库及执行程序的完整流程。

2.1 创建 Libtool 对象文件

使用传统方法,创建对象文件的命令如下:

gcc -c compress.c

使用 Libtool 则为:

libtool --mode=compile gcc -c compress.c

Libtool 会自动添加 -fPIC-DPIC 选项,生成位置独立的代码,以便后续创建动态链接库。

2.2 创建 Libtool 库

使用 Libtool 创建动态链接库的命令如下:

libtool --mode=link gcc -o libcompress.la compress.lo -rpath /tmp -lz

此命令生成以下文件:

  • 动态链接库 libcompress.so
  • 静态链接库 libcompress.a
  • Libtool 对应的文本文件 libcompress.lo

2.3 安装 Libtool 库

安装命令如下:

libtool --mode=install install -c libcompress.la /tmp

Libtool 会将库文件安装到指定路径,并创建符号链接以便后续使用。

2.4 使用 Libtool 库

在应用程序中使用 Libtool 库非常简单。例如,准备以下源文件 main.c

#include 
extern int compress_file(const char *filename);
int main(int argc, char *argv) {
if (argc < 2) {
printf("usage: %s file\n", argv[0]);
return 1;
}
return compress_file(argv[1]);
}

创建对象文件并链接:

libtool --mode=compile gcc -c main.c
libtool --mode=link gcc -o main main.lo /tmp/libcompress.la

2.5 使用未安装的库

如果不安装库,可以直接使用本地文件:

libtool --mode=link gcc -o main main.lo ./libcompress.la

2.6 卸载 Libtool 库

卸载命令如下:

libtool --mode=uninstall rm /tmp/libcompress.la

这将删除所有相关文件,包括动态和静态链接库。

三、Libtool 高级用法

3.1 创建可动态加载模块

Libtool 支持创建可动态加载模块。例如:

libtool --mode=link gcc -o compress.la compress.lo -rpath /tmp -module -avoid-version

此命令生成一个可动态加载模块,不附加版本号。

3.2 禁止创建动态或静态链接库

Libtool 默认同时创建动态和静态链接库。要禁止创建动态链接库,可以修改 Libtool 脚本:

vim /usr/bin/libtool

查找并修改以下行:

build_libtool_libs=yes

yes 改为 no

同样,禁止创建静态链接库:

build_old_libs=no

3.3 Libtool 命令模式

Libtool 支持多种命令模式,包括编译、链接、安装等。每种模式对应开发的不同阶段。

3.4 库版本信息

Libtool 支持库版本号管理,通过指定 -version-info 参数设置主版本、次版本和年龄。默认版本为 0.0.0

3.5 避免版本信息

如果不需要版本号,可以使用 -avoid-version 选项:

libtool --mode=link gcc -o libcompress.la compress.lo -rpath /tmp -avoid-version

四、结合 Autoconf 和 Automake 使用 Libtool

4.1 Makefile.am

# _LTLIBRARIES 是 Automake 支持 Libtool 的原语
lib_LTLIBRARIES = libcompress.la
libcompress_la_SOURCES = compress.c
libcompress_la_LDFLAGS = -module -avoid-version
libcompress_la_LIBADD = -lz

4.2 configure.ac

# 初始话 Automake
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
AC_PROG_LIBTOOL
# 安装路径
AC_CONFIG_FILES([Makefile])

4.3 Makefile 和 configure

通过 autoreconf -i -s 生成配置文件和 Makefile。

4.4 安装 Libtool 库

make install

4.5 卸载 Libtool 库

make uninstall

4.6 创建执行程序

bin_PROGRAMS = main
main_SOURCES = main.c
main_LDFLAGS =
main_LDADD = libcompress.la

4.7 调试执行程序

libtool --mode=execute gdb main

4.8 小结

本文档介绍了 GNU Libtool 的功能及其在项目中的应用。通过结合 Autoconf 和 Automake,Libtool 的使用更加简便和高效。建议在使用前参考 Libtool 手册获取更详细信息。

上一篇:Spring AOP
下一篇:gcc 的使用

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月18日 01时29分58秒