您现在的位置是:首页 >其他 >linux系统下C/C++静态库和动态库的制作及使用网站首页其他

linux系统下C/C++静态库和动态库的制作及使用

学习不毕业 2023-06-30 09:27:50
简介linux系统下C/C++静态库和动态库的制作及使用

1 静态库的制作

静态库简介

一般情况下,为了更好的支持开发,第三方库或者是语言库都必须提供静态库和动态库(eg:C C++等官方库),这是方便程序员根据需求功能进行可执行文件的生成;
动态链接使用动态库,而静态链接使用静态库。
一般来说,我们gcc编译默认是动态链接的而如果加上-static选项,那么生成的可执行文件将为静态生成;

1.1 编写源码

add.cpp

int add(int a,int b)
{
   return a + b;
}

sub.cpp

int sub(int a,int b)
{
  	return a - b;
}

1.2 生成目标文件

g++ -c add.cpp -o add.o
g++ -c sub.cpp -o sub.o

在这里插入图片描述

1.3 ar归档,打包成静态库

ar -r -c libcal.a *.o

在这里插入图片描述

1.4 查看静态库

ar -t -v libcal.a

在这里插入图片描述

1.5 测试静态库

#include <iostream>
using namespace std;
#include "sub.h"
#include "add.h"
int main()
{
    int iVal1 = 200;
    int iVal2 = 100;
    cout << sub(iVal1,iVal2) << endl;
    cout << add(iVal1,iVal2) << endl;
    return 0;
}

编译链接

g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal -static
  • -I (大写i) 指定路径:告知g++除了默认路径之外,还要去寻找这个指定路径的头文件。
  • -L + 指定路径 除默认库路径以外,需要寻找我们这个库的存放路径
  • -l(小写L) 库名称:表示要具体链接的是哪一个库,即库的具体名称;(因为路径下库可能不止一个)
  • -static 打包成静态库

在这里插入图片描述
编译链接过程中出现以上报错的解决办法

### 安装 glibc-static libstdc++
yum install glibc-static libstdc++-static

再次进行编译链接就不会报错

1.6 运行测试

在这里插入图片描述
删除动态库之后同样可以运行

2 动态库

2.1 编写 Makefile

代码的跟静态库的是一样的 可以直接进行动态库的制作

libcal.so:add.o sub.o
       ###################
       ## $@ -- 目标文件
       ## $^ -- 所有的依赖文件
       ## $< -- 第一个依赖文件
       ## g++ 带上-shared选项表示生成共享动态库格式
       ###################
       @echo target=$@
       g++ -shared -o $@ $^
add.o:add.cpp
       @echo target=$@
       g++ -fPIC -c $^
sub.o:sub.cpp
       @echo target=$@
       g++ -fPIC -c $^
clean:
       rm *.o libcal.so

在这里插入图片描述

2.2 编译链接动态库

g++ -o test test.cpp -I ./lib/ -L ./lib/ -l cal

运行可执行程序

./test
./test: error while loading shared libraries: libcal.so: cannot open shared object file: No such file or directory

执行之后发现程序找不到动态库!!!

这属于运行问题,其实运行时系统也会去默认路径下找到我们所使用的动态库,但在默认路径下没有我们的库

解决办法
修改环境变量LD_LIBRARY_PATH,将动态库所在路径.lib添加到该环境变量中,这样程序在运行时系统就能够找到动态库,从而运行成功

## 
vim ~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/mysqlTest/lib_test/lib
source ~/.bashrc

执行

./test
[mysql@chao_2 /home/mysql/mysqlTest/lib_test]$./test
100
300

运行结果正确!!!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。