Linux下g++编译与使用静态库和动态库的方法
作者:jingxian 时间:2023-06-21 13:41:46
在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 <iostream>
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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Springboot创建项目的图文教程(idea版本)
![](https://img.aspxhome.com/file/2023/7/63157_0s.png)
android 选项卡(TabHost)如何放置在屏幕的底部
Java异常简介和架构_动力节点Java学院整理
![](https://img.aspxhome.com/file/2023/8/77958_0s.jpg)
教你如何使用Java实现WebSocket
![](https://img.aspxhome.com/file/2023/2/94372_0s.png)
Android 操作系统获取Root权限 原理详细解析
![](https://img.aspxhome.com/file/2023/7/88697_0s.jpg)
Android 内存泄漏的几种可能总结
![](https://img.aspxhome.com/file/2023/7/100627_0s.png)
Java数据结构之常见排序算法(下)
![](https://img.aspxhome.com/file/2023/4/69334_0s.png)
Android工具类Toast自定义图片和文字
![](https://img.aspxhome.com/file/2023/0/91010_0s.jpg)
Spring Boot + thymeleaf 实现文件上传下载功能
![](https://img.aspxhome.com/file/2023/0/61680_0s.png)
Java中synchronized锁的深入理解
![](https://img.aspxhome.com/file/2023/1/64771_0s.webp)
Android自定义View实现比赛时间闪动效果
![](https://img.aspxhome.com/file/2023/3/94283_0s.gif)
Unity3D应用之时钟与钟表小组件的使用教程
![](https://img.aspxhome.com/file/2023/1/91361_0s.png)
Unity打包代码到DLL的实现
![](https://img.aspxhome.com/file/2023/2/78152_0s.jpg)
SpringBoot的@Value给静态变量注入application.properties属性值
springboot下ueditor上传功能的实现及遇到的问题
![](https://img.aspxhome.com/file/2023/5/125515_0s.jpg)
java使用链表实现约瑟夫环
Android自定义View基础开发之图片加载进度条
![](https://img.aspxhome.com/file/2023/6/138126_0s.jpg)
Flutter 透明状态栏及字体颜色的设置方法
举例讲解C#编程中对设计模式中的单例模式的运用
![](https://img.aspxhome.com/file/2023/2/94632_0s.png)
IDEA最新版2020.1的maven工程本地依赖仓库无法使用问题(已解决)
![](https://img.aspxhome.com/file/2023/1/60831_0s.png)