c++静态库和动态库

2022-11-05  本文已影响0人  arkliu

测试类的准备

先新建几个类来测试静态库和动态库的生成和使用
lib_a.h

#ifndef LIB_A_H
#define LIB_A_H

#include <iostream>
using namespace std;

void myPrint();   // 自定义函数的声明
#endif

lib_a.cpp

#include "lib_a.h"

void myPrint() {
    cout <<"大家好,我叫张三"<<endl;
    //cout <<"我爱北京天安门"<<endl;
    //cout <<"保护环境人人有责"<<endl;
}

lib_a_test.cpp

#include "lib_a.h"

int main() {
    myPrint();
}
image.png

静态库

静态库在编译的时候,主程序会把静态库编译进去,这样做的优点是,编译完成后,生成的可执行文件可以脱离静态库独立运行, 缺点是,静态库的文件每次改动,都要重新编译主程序

静态库文件名的命名方式是“libxxx.a”,库名前加”lib”,后缀用”.a”,“xxx”为静态库名

静态库的制作

g++ -c -o libtest.a lib_a.cpp
image.png

使用静态库

g++ -o myPrint lib_a_test.cpp libtest.a
image.png
g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
image.png

注意:

动态库

动态库在编译时并不会被连接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要指定动态库的目录。

动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so” “xxx”为动态库名。

生成动态库

g++ -fPIC -shared -o libtest.so lib_a.cpp

使用动态库

\color{red}{使用动态库的方法与使用静态库的方法相同, 如果在动态库文件和静态库文件同时存在,优先使用动态库编译}

g++ -o myPrint lib_a_test.cpp -L/home/lh/code/lib_a -ltest
image.png

报错:./myPrint: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
这是因为采用了动态链接库的可执行程序在运行时需要指定动态库文件的目录,Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录

export LD_LIBRARY_PATH=/home/lh/code/lib_a
image.png
上一篇 下一篇

猜你喜欢

热点阅读