静态库与动态库

第1章 静态库

理论

静态库编译快,但占用空间大。动态库编译慢,但占用空间小。具体建议去网上搜,会说得比较仔细。

创建静态库命令

ar是创建静态库的工具。rcs是命令参数静态库一般以lib开头,以.a为后缀file.o是用来制作静态库的汇编文件

ar rcs libmylib.a file.o

创建简单静态库及使用

制作步骤1.将.cpp文件生成.o文件2.使用ar工具制作静态库

创建.cpp文件

创建add.cpp文件

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

创建sub.cpp文件

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

创建div.cpp文件

int div(int a,int b)
{
    return a/b;
}

生成.o文件

不加-o 参数也会将默认将生成的文件取名为对应的.o文件

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

生成静态库

ar rcs libmymath.a add.o sub.o div.o

新建文件夹lib,生成该静态库后,将.a文件移动到lib下

制作静态库头文件

静态库通常会有对应的头文件,因此我们还需要制作头文件新建文件夹,在该文件夹下制作头文件mymath.h

#pragma once
int add(int a,int b);
int sub(int a,int b);
int divl(int a,int b);

编译和使用

创建main.cpp文件

#include<iostream>
#include"mymath.h"

using namespace std;

int main()
{
    int a=10;
    int b=3;
    cout<<"a+b="<<add(a,b)<<endl;
    cout<<"a-b="<<sub(a,b)<<endl;
    cout<<"a/b="<<divl(a,b)<<endl;
    return 0;
}

查看当前目录下的文件

inc(含有mymath.h文件)
lib(含有libmymath.a文件)
main.cpp

编译链接

g++ main.cpp ./lib/libmymath.a -o main -I ./inc

第2章 动态库

动态库制作与使用

创建.cpp文件

创建add.cpp,sub.cpp,div.cpp。文件内容读者自己写,此处略过。

生成.o文件

将.c文件生成.o文件(生成与位置无关的代码,加上参数 -fPIC)

gcc -c  add.c -o add.o -fPIC
gcc -c  add.c -o sub.o -fPIC
gcc -c  add.c -o div.o -fPIC

制作动态库

使用gcc -shared 制作动态库注意这里的.o文件都是加上-fPIC参数生成的

gcc -shared lib库名.so add.o sub.o div.o

创建一个lib文件夹,将生成的.so文件放到lib下

制作动态库头文件

制作一个inc文件夹,创建mymath.h头文件。

#pragma once
int add(int a,int b);
int sub(int a,int b);
int divl(int a,int b);

编译和运行

先查看你你当前目录下的文件(其它文件不要管)

inc(含有mymath.h文件)
lib(含有libmymath.so文件)
main.cpp(写了main函数)

编译可执行程序时,指导所使用的动态库。-l:指定库名 -L:指定库路径。 注意-l指定动态库文件时去掉lib前缀,去掉.so后缀。-l和-L后面的文件可以选择加上空格或者不加。

g++ main.cpp -o main -lmymath -L./lib -I./inc

运行可执行程序main出错:原因:编译时需要用到链接器和动态链接器。这里没有指定动态库所在目录位置。链接器: 工作于链接阶段,工作时需要-l和-L参数动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置

解决办法

解决办法有以下4种:

  1. 临时设置环境变量(关闭终端后失效)
  2. 在./bashrc文件种写入环境变量
  3. 拷贝动态库到/lib(标准c++库所在目录),但是不建议这样做。
  4. 配置文件

  1. 临时设置环境变量:
LD_LIBRARY_PATH=./lib(建议这里最好绝对路径设置环境变量)

执行main命令还是会出错,原因是我们还没有导出我们的环境变量

export LD_LIBRARY_PATH=./lib(建议这里最好使用绝对路径设置环境变量)

现在就可以正常执行main程序了。

  1. 配置文件 1)sudo vim /etc/ld.so.conf 2)将动态库的绝对路径追加到该文件下 3)sudo ldconfig -v 使配置文件生效,-v就是查看的意思
全部评论
之前面试我还被问到这两种库的区别了
点赞 回复 分享
发布于 2023-04-25 10:24 甘肃
之前我就看到过.a结尾的,当时还不知道是啥,还特意查了后才知道
点赞 回复 分享
发布于 2023-04-25 17:33 四川

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务