C++ Linux下的库(静态库与动态库)

亦凉 2023-03-01 05:36 48阅读 0赞

库就是 一种可执行代码的二进制格式,可以被载入内存执行。
库可分为静态库动态库
其中动态库又叫共享库 share
静态库一般以.a 结尾, 动态库一般以 .so 结尾、
但不论是哪一种,都是给调用着提供 变量、函数、类的。

区别

静态库和动态库在实际使用中的区别

静态库: 在程序编译时,静态库提供的所有变量 函数 类 都会链接合成到 一个可执行文件中。

  • 好处就是 不再有依赖问题
  • 坏处就是 编译后的可执行文件 体积比较大

动态库:也叫共享库,它并不会链接到代码中,而是程序启动运行时被载入、

  • 好处就是 编译后的执行文件 体积小
  • 坏处就是 必须保证引用的动态库存在,且程序能够找到它,换个机器有依赖问题

静态库使用

创建 test.cpp

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. void f_test(int age)
  5. {
  6. cout << "your age is " << age << endl;
  7. printf("age:%d\n",age);
  8. }

使用g++ 编译

  1. g++ -c test.cpp # 会生成 test.o
  2. ar rcs libtest.a test.o
  • ar 静态函数创建的命令
  • rcs 是ar命令的参数
  • test.o 就是我们刚刚命令生成的文件
  • libtest.a 这里要说一说,lib一般库的格式都会以这3个开头,然后.a是静态库的后缀,test是我们静态库的名字

使用静态库,创建main.cpp

  1. extern void f_test(int age); //声明要使用的函数
  2. #include <iostream>
  3. using namespace std;
  4. int main(int argc, char *argv[])
  5. {
  6. f_test(99);
  7. cout << "HI" << endl;
  8. return 0;
  9. }

编译

  1. g++ -o main main.cpp -L. -ltest
  • -L . 告诉g++ . 当前目录去找库文件
  • -ltest 前缀lib和 后缀.a 省略, 在当前目录查找libtest,它首先回去找.so结尾的动态库,找不到才找到我们的静态库

执行

  1. ./main

动态库使用

test.cppmain.cpp 代码不变

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. void f_test(int age)
  5. {
  6. cout << "your age is " << age << endl;
  7. printf("age:%d\n",age);
  8. }
  9. extern void f_test(int age); //声明要使用的函数
  10. #include <iostream>
  11. using namespace std;
  12. int main(int argc, char *argv[])
  13. {
  14. f_test(99);
  15. cout << "HI" << endl;
  16. return 0;
  17. }

执行,生成动态库 libtest.so

  1. g++ test.cpp -fPIC -shared -o libtest.so

生成可执行文件

  1. g++ main.cpp -o main -L. -ltest

执行

  1. ./main

将二进制文件可执行文件main移出目录,发现执行不了了

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

我们将libtest.so 移动到 系统公共的库目录中 ,如 /lib、/lib64 都可以

然后再次执行,发现又可以了。

发表评论

表情:
评论列表 (有 0 条评论,48人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++静态动态

    C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布