libtool编译

1.充分利用共享库的能力。libtool 是一个通用库支持脚本
2.我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节,只要告诉libtool说我需要要编译哪些库即可,并且,它只与libtool文件打交道,例如lo、la为后缀的文件
3.通常libtool是与GNU建构系统中的autoconf和automake这两个工具一起使用
4.libtool生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字

1. 编译

# ./libtool --mode=compile --tag=CC $(CC) -I./include -c test.c    //compile编译
//结果
./libtool --mode=compile --tag=CC cc -I./include -c  test.c 
libtool: compile:  cc -c test.c  -fPIC -DPIC -o .libs/test.o
# ./libtool --mode=compile --tag=CC mipsel-linux-gcc -I./include -c test.c

2. 交叉编译需要tag

Language name Tag name
C CC
C++ CXX
Java GCJ
Fortran 77 F77
Windows Resource RC

3. 编译库文件

./libtool --mode=link --tag=CC $(CC) -o libtest.la test.lo -I./include -rpath /usr/local/lib
//结果
./libtool --mode=link --tag=CC cc -o libtest.la test.lo -I./include -rpath /usr/local/lib
libtool: link: rm -fr  .libs/libtest.la .libs/libtest.lai .libs/libtest.so .libs/libtest.so.0 .libs/libtest.so.0.0.0
libtool: link: gcc -shared  -fPIC -DPIC  .libs/test.o      -Wl,-soname -Wl,libtest.so.0 -o .libs/libtest.so.0.0.0
libtool: link: (cd ".libs" && rm -f "libtest.so.0" && ln -s "libtest.so.0.0.0" "libtest.so.0")
libtool: link: (cd ".libs" && rm -f "libtest.so" && ln -s "libtest.so.0.0.0" "libtest.so")
libtool: link: ( cd ".libs" && rm -f "libtest.la" && ln -s "../libtest.la" "libtest.la" )

在一些旧版本的系统上,ranlib负责把静态库转换为其他的某种格式,使得新的库能够更快的链接;现在ar命令已经包含了上述功能;
为了兼容性,在makefile中还是保留ranlib

//如果报错
libtool: link: libtool library `dmproc.la' must begin with `lib'
-module     //可以解决此问题

3. 编译可执行文件

./libtool --mode=link --tag=CC $(CC) -o test test.lo libtest.la 
//结果
./libtool --mode=link --tag=CC cc -o test test.lo libtest.la 
libtool: link: cc -o .libs/test .libs/test.o  ./.libs/libtest.so -Wl,-rpath -Wl,/usr/local/lib

4. 安装

./libtool --mode=install install libtest.la /usr/local/lib/libtest.la
//结果
./libtool --mode=install install libtest.la /usr/local/lib/libtest.la
libtool: install: install .libs/libtest.so.0.0.0 /usr/local/lib/libtest.so.0.0.0
libtool: install: (cd /usr/local/lib && { ln -s -f libtest.so.0.0.0 libtest.so.0 || { rm -f libtest.so.0 && ln -s libtest.so.0.0.0 libtest.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libtest.so.0.0.0 libtest.so || { rm -f libtest.so && ln -s libtest.so.0.0.0 libtest.so; }; })
libtool: install: install .libs/libtest.lai /usr/local/lib/libtest.la
libtool: finish: PATH="/sbin:/bin:/usr/sbin:/usr/bin:/sbin" ldconfig -n /usr/local/lib

5. 运行

./libtool --mode=execute test 
posted @   thomas_blog  阅读(562)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示