0
点赞
收藏
分享

微信扫一扫

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

狗啃月亮_Rachel 2023-05-02 阅读 53

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

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

### 安装 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

运行结果正确!!!

举报

相关推荐

0 条评论