C++ project

centos7环境下使用

静态库和动态库:当我们需要把一些通用的功能封装起来,供以后调用的时候。在之前我们是将公用的部分提炼出来写在一个xxx.h和xxx.cpp文件中,然后在我们的主程序中引入xxx.h的头文件,然后再在编译的时候将主程序和xxx.cpp文件一起编译实现的。

在编译的时候其实有两个过程,首先会将主程序main.cpp和公用的xxx.cpp分别编译为两个二进制的文件,然后在链接在一起形成一个可执行文件。

上面的这种依赖其他的公用代码的方式在C++中可以通过将依赖编译为库的方式来引用。

编译出来的库又分为两种:静态库和动态库。

静态库:当我们将上面的公用的部分编译为一个静态库的时候,在使用这个静态库的时候编译器会将静态库和主程序代码一起链接打包到生成的可执行文件中去。这样生成的可执行文件可能就会比较臃肿,但是执行的时候比较快,而且由于将需要的东西都全部打包在一起了,这个执行文件的移植性就比较好。还有就是如果我们的库文件更新了,那么这个主程序就需要引入更新后的库文件重新打包。

静态库的生成和使用:

代码文件_public.h

#include <stdio.h>

void sayhello();

代码文件_public.cpp

#include "./_public.h"

void sayhello()

{

  printf("hello~\n");

}

主程序文件:test.cpp

#include "./_public.h"

sayhello();

首先将_public.c编译成二进制的.o文件:g++ -c _public.cpp。完成后当前目录会生成一个_public.o的文件

通过ar工具将目标文件打包成.a静态库文件:ar -crv lib_public.a _public.o。完成后当前目录下会生成一个lib_public.a文件,这个文件就是静态库文件

将主程序文件和静态库文件一起打包生成可执行文件:g++ -o test test.cpp -L./ -l_public。-L用来指定静态库所在的目录,我们的静态库就在当前目录下所以直接用./。-l后面跟的是引用的静态库的名称(去除掉前面的lib和后缀.o)

然后./test执行生成的可执行文件test

动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。

同样上上面的代码将其编译为共享库并调用的流程如下:

首先将_public.c编译成二进制的.o文件:g++ -fPIC -c _public.cpp。完成后当前目录会生成一个_public.o的文件,-fPIC 创建与地址无关的编译程序(pic,position independent code),是为了能够在多个应用程序间共享。

生成动态链接库.so文件:g++ -shared -o lib_public.so _public.o。完成后当前目录会生成一个lib_public.so文件,该文件就是生成的动态链接库。

生成可执行文件:g++ -o test1 test.cpp -L./ -l_public

将生成的lib_public.so文件拷贝到/usr/lib中,因为这个g++默认去寻找动态库的地址:cp lib_public.so /usr/lib/lib_public.so。

执行命令:ldconfig。这个命令用于更新动态库的列表以便能将我们新拷贝进去的库文件能被g++找到。

运行程序:./test1

猜你喜欢

转载自www.cnblogs.com/maycpou/p/12605681.html