linux下用GCC生成静态库和动态库过程

目录

一、什么是动态库和静态库

     动态库

     静态库

二、用gcc生成动态库和静态库

     编辑生成例子程序

     将hello.c文件编译成hello.o文件

     创建静态库

     在程序中使用静态库

     由hello.o文件生成动态库文件

     在程序中使用动态库

三、实例

     题目要求

     完成步骤

四、总结

一、什么是动态库和静态库

静态库

静态库即静态链接库。之所以叫做静态,是因为静态库在编译的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。静态库的好处很明显,编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。当然其缺点也很明显,就是会使用目标程序的体积增大。

动态库

动态库即动态链接库。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。动态库的优点是,不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。动态库带来的问题主要是,动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少动态库或者库的版本不正确,就会导致程序无法运行。

二、用gcc生成动态库和静态库

 编辑生成例子程序

先分别编辑三个需要的程序hello.h,hello.c,main.c

 

   将hello.c文件编译成hello.o文件

无论静态库还是动态库,都是由.o文件创建的。所以必须通过gcc将源程序hello.c文件编译成hello.o文件,在系统提示符的命令下即可得到。

输入指令gcc-c hello.c

运行IS命令查看是否生产了hello.o文件 

运行结果如下:

 

 创建静态库

 静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。创建静态库用ar命令。在系统提示符下键入以下命令将创建静态库文件libmyhello.a。输入指令ar-crv libmyhello.a hello.o。再运行指令IS即可得到结果。

   在程序中使用静态库

问:静态库制作完成后,如何使用其内部的函数呢?

答:只需要在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明静态库名,gcc将会从静态库中将公用函数连接到目标文件中。

在 main.c 中,我们包含了静态库的头文件 hello.h ,然后在主程序 main 中直接调用公用函数 hello。下面先生成目标程序 hello,然后运行 hello 程序。

具体方法如下:

 

 由hello.o文件生成动态库文件

动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀 lib,但其文件扩展名为.so。  例如:我们将创建的动态库名为 myhello,则动态库文件名就是 libmyhello.so。

用 gcc来创建动态库:键入以下命令得到动态库文件  libmyhello.so

 gcc -shared -fPIC -o libmyhello.so hello.o 

使用 ls 命令查看动态库文件是否生成,实际运行结果如下所示:

得到了动态库文件  libmyhello.so 

 在程序中使用动态库

在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含
这些公用函数的原型声明,然后在用 gcc 命令生成目标文件时指明动态库名进行编译。

我们运行 gcc 命令生成目标文件,再运行它观察结果。

 

三、实例

题目要求

1)编写一个主程序文件main.c 和两个子程序文件 sub1.c,sub2.c,
要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;再扩展写一个x2y函数(功能自定);

main函数代码将调用x2x和x2y ;返回结果printf出来。
2)将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;

将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。

3)将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。

完成步骤

利用vim文本编辑器编辑需要的文件sub1.c,sub2.c,sub.h,main.c

 

 

键入以下命令将三个.c文件编译成.o文件

gcc -c sub1.c
gcc -c sub2.c
gcc -c main.c

 

生成了sub1.o,sub2.o,main.o文件。

将两个目标文件用 ar 工具生成 .a 静态库        

ar -crv libsub.a sub1.o sub2.o

运行之后即可得到结果

 

 四、总结

本次主要学习了使用gcc创建与使用静态库和动态库,虽然整个过程遇到了很多困难,但在请教了老师和同学之后有了明显的进步,对动态库和静态库的原理以及生产过程都有了更加深刻的认识。

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Windows和Linux生成静态库动态库过程有些不同,下面分别介绍: **在Windows上生成静态库:** 1. 使用Visual Studio打开C/C++项目,右键点击项目名称,选择“属性”。 2. 选择“配置属性” -> “常规”,将“配置类型”设置为“静态库(.lib)”。 3. 在“配置属性” -> “C/C++” -> “常规”中,将“附加包含目录”设置为头文件所在目录。 4. 在“配置属性” -> “Librarian” -> “常规”中,将“附加库目录”设置为库文件输出目录。 5. 在“配置属性” -> “Librarian” -> “输入”中,添加需要生成静态库的源文件。 6. 点击“生成解决方案”,生成静态库文件。 **在Windows上生成动态库:** 1. 使用Visual Studio打开C/C++项目,右键点击项目名称,选择“属性”。 2. 选择“配置属性” -> “常规”,将“配置类型”设置为“动态库(.dll)”。 3. 在“配置属性” -> “C/C++” -> “常规”中,将“附加包含目录”设置为头文件所在目录。 4. 在“配置属性” -> “C/C++” -> “代码生成”中,将“运行库”设置为“多线程调试(/MTd)”或“多线程(/MT)”。 5. 在“配置属性” -> “Librarian” -> “常规”中,将“附加库目录”设置为库文件输出目录。 6. 在“配置属性” -> “Librarian” -> “输入”中,添加需要生成动态库的源文件。 7. 点击“生成解决方案”,生成动态库文件。 **在Linux生成静态库:** 1. 在命令行中进入源代码所在目录,执行以下命令生成目标文件: ``` gcc -c source.c -o object.o ``` 2. 使用ar命令生成静态库文件: ``` ar rcs libmylib.a object.o ``` 其中,-r参数表示将目标文件插入到库中,-c参数表示创建新的库文件,-s参数表示在库中添加符号表。 3. 生成静态库文件名为libmylib.a。 **在Linux生成动态库:** 1. 在命令行中进入源代码所在目录,执行以下命令生成共享目标文件: ``` gcc -c -fPIC source.c -o object.o ``` 其中,-c参数表示只编译不链接,-fPIC参数表示生成位置无关代码。 2. 使用gcc命令生成共享库文件: ``` gcc -shared -fPIC -o libmylib.so object.o ``` 其中,-shared参数表示生成共享库,-fPIC参数表示生成位置无关代码,-o参数指定生成的共享库文件名。 3. 生成动态库文件名为libmylib.so。 需要注意的是,生成静态库动态库过程中需要指定库文件输出目录和头文件所在目录,以便后续使用时能够正确链接库文件和头文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值