如何编译静态库及将多个.a静态库合并成一个.a静态库

所使用的命令为ar
1 将所有的.a库解压成.o文件
ar x xx.a
2 将所有的.o 文件合并成.a
ar rcs xx.b *.o
3 编译.a 静态库
1)生成对应的.o 文件 gcc -c a.c b.c
2)使用ar命令合成静态库 ar crs libjson.a *.o
3) 查看编译库使用的gcc 版本: strings libjson.a |grep GCC
4) 调用方法: gcc main.c -o main libjson.a --------------------- 本文来自 亦轩 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wang112031/article/details/50054651?utm_source=copy

==================================================================

静态库编译连接实例

1、目的:

A源码在进行功能实现的时候,需要用到独立的B源码的接口和功能。那么此时可以将B源码编译成指定的lib库的方式,这里指的的 xxx.a的方式,而不是xxx.so的方式。那么在A调用B接口的时候,直接在编译选项中增加 -L参数指定需要的库.a文件即可。那么在A中就能直接通过包含的B的头文件对B中的函数进行调用了。

2、实例

B有两个文件,一个提供打印,一个提供add功能
print.c //提供打印函数
print.h //提供打印接口
add.c //提供add函数
add.h //提供add接口
这里写图片描述

2.1编译

将以上两个文件编译成libmylib.a
gcc -c add.c print.c //编译生成add.o和print.o
ar crv libmylib.a add.o print.o //编译生成libmylib.a静态库文件
这里写图片描述

2.1编译main函数

main文件信息
这里写图片描述
编译:gcc main.c -L../lib_file/ -lmylib //意思就是在当前目录上一层目录lib_file下找libmylib.a文件进行链接
这里写图片描述
这样当生存的a.out可执行文件的打印函数和add函数就是调用的静态库中的函数

--------------------- 本文来自 张翼_XZY 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_37871174/article/details/78394792?utm_source=copy

==========================================================================

linux编程合并多个静态库.a为一个.a

 

.a 文件的结构和.tar文件就没有什么区别。 x 命令解出来, a 命令添加, t命令列表
假设A.a, B.a C.a 在/usr/local/lib目录下
mkdir /tmp/libABC
cd /tmp/libABC
ar x /usr/local/lib/A.a
ar x /usr/local/lib/B.a
ar x /usr/local/lib/C.a
ar cru libABC.a *.o
ranlib libABC.a

 

1、gcc入门

(1)gcc即是linux下c/c++的编译器。

gcc经常用的的选项有-c,-o。

 

-c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件(二进制文件),一般是.o文件。

-o用于指定输出(out)文件名。不用-o的话,一般会在当前文件夹下生成默认的a.out文件作为可执行程序。

 

我们在任意位置新建一个test文件夹,方便我们写测试文件。

现在我们新建一个test.cpp文件,里面代码如下:

  1. #include "stdio.h"  
  2. int main()  
  3. {  
  4.     printf("test  !!!!!\n");  
  5.     return 0;  
  6. }  

 

-c选项:

gcc -c test.cpp

生成二进制test.o文件,.o文件是一个中间文件 ,可制作成库文件,也可以生成可执行文件。

-o选项:

gcc test.cpp -o test

  或者,利用刚刚生成的test.o文件:gcc test.o -o test

即可生成test可执行文件。

如果命令为:

gcc test.cpp 或 gcc test.o

即像上文所说的生成a.out可执行文件。

 

 

2、合并静态库

制作静态库

ar rc libtest.a test.o

现在说本文的重点,合并静态库。

有关制作静态库命令可以参考

linux ar命令

而静态库的使用,百度一下。

注意链接文章说的,静态库的模块是.o文件。

之前我一直想把一个静态库包含到另一个静态库里,比如:ar rc liball.a libtest1.a libtest2.a

即把libtest1.a和libtest2.a包含到liball.a里面,这句话是没问题!

但是这种思路是错的!!!!!

如果当你想要用到libtest1.a或libtest2.a里的函数里,是找不到的!!!

因为liball.a里包含的是libtest1.a和libtest2.a,而gcc找的里.o文件,.o文件里才包含我们写好的方法

所以我们应该这样来写:

制作一个临时文件夹,比如在我们的test文件夹下新建temp文件夹,把从各个.a库导出的.o文件都放到这个文件夹里,再把所以.o文件打成.a库。

命令如下:

cd temp

ar x libtest1.a

ar x libtest2.a

ar rc liball.a *.o

再把liball.a复制出来就可以了

你可能感兴趣的:(C)