Linux基础——g++编译、静态库与动态库(共享库)
发布日期:2025-04-08 14:39:29 浏览次数:11 分类:精选文章

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

在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的。刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐。

下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的)。

首先是准备工作,把我们需要封装成库文件的函数的头文件与源文件写好,如下:

//myAPI.h int ADD(int a, int b); int MINUS(int a, int b);
//myAPI.cpp #include "myAPI.h"  int ADD(int a, int b){   return a + b; }  int MINUS(int a, int b){   return a - b; }

接下来准备一个测试用的主函数源文件:

//main.cpp #include "myAPI.h" #include 
int main(){ std::cout << "1 + 1 = " << ADD(1, 1) << std::endl; std::cout << "1 - 1 = " << MINUS(1, 1) << std::endl; return 0; }

最后,先编译我们的 myAPI.cpp 文件生成 myAPI.o 目标文件:

g++ -c myAPI.cpp 

1.生成静态库并使用

 Linux下用生成静态库的命令 ar 处理 myAPI.o 文件生成静态库文件,生成的库文件应遵循规范,及linux下库文件加“lib”前缀。所以针对本例,通过如下一条命令即可生成 libmyAPI.a 静态库:

ar crv libmyAPI.a myAPI.o

接下来即可在项目编译过程中利用静态库了,此时 myAPI.cpp 这个库函数的定义文件已经不需要了。main.cpp 编译命令如下(注意,依赖的静态库文件要放在被依赖项后面):

g++ main.cpp libmyAPI.a -o output

编译通过后即可运行可执行文件 output , 此时 libmyAPI.a 也已经是不需要的了。执行命令并输出结果如下:

./output

2.生成动态库并使用

linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下:

g++ -shared -fPIC -o libmyAPI.so myAPI.o

生成的动态库在编译时需要声明,运行时需要被依赖。声明如下:

g++ main.cpp -L. -lmyAPI -o output

”-L.”标记告诉G++函数库可能位于当前目录;使用”-lmyAPI”标记来告诉G++驱动程序在连接阶段引用共享函数库libmyAPI.so。

使用时如果提示如下错误,则将 libmyAPI.so 移到 /usr/lib 目录下即可:

./output

 补充知识点:

 

 

上一篇:Linux基础——gcc编译、静态库与动态库(共享库)
下一篇:linux基础-第七单元 用户、群组及权限的深入讨论

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年05月07日 02时45分26秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Linux学习总结(28)——Linux主机加固 2023-02-03
Linux学习总结(29)——CentOS 6和CentOS 7区别总结 2023-02-03
Linux学习总结(2)——linux常用命令大全 2023-02-03
Linux学习总结(2)——linux常用命令大全 2023-02-03
Linux学习总结(30)——优秀程序员喜欢用Linux操作系统 2023-02-03
Linux学习总结(36)——创建、复制、剪切、重命名、清空和删除文件夹的命令 2023-02-03
Linux学习总结(37)——CentOS7下Firewall防火墙配置用法详解 2023-02-03
Linux学习总结(38)——Linux超实用的30个命令 2023-02-03
Linux学习总结(39)——系统管理员应该知道的 20 条 Linux 命令 2023-02-03
Linux学习总结(3)——Linux实用工具 2023-02-03
Linux学习总结(40)——史上最全Linux命令科普 2023-02-03
Linux学习总结(41)——运维不仅仅是Linux 2023-02-03
Linux学习总结(42)——Linux之Bash脚本入门学习 2023-02-03
Linux学习总结(43)——企业运维最常用的150个Linux命令 2023-02-03
Linux学习总结(44)——Linux操作系统基础知识 2023-02-03
Linux学习总结(45)——Linux服务器出现卡慢的基本解决方法 2023-02-03
Linux学习总结(46)——Centos7.4设置开机自动登陆及网卡自动启用 2023-02-03
Linux学习总结(47)——Linux系统用户以及用户组的管理 2023-02-03
Linux学习总结(48)——Linux防火墙iptables与firewalld学习总结 2023-02-03
Linux学习总结(49)——应当竭力避免在系统中运行的 Linux 命令 2023-02-03