库文件(动态库和静态库)

1.库文件

通常,我们会在头文件中对类以及函数进行声明,在.cpp源文件中完成具体的实现。

但是这个.cpp文件是对所有人可见的,不具备安全性、保密性,而C/C++提供了一个方法,将这个.cpp源文件编译成一个库文件,是一种可执行代码的二进制形式,可以与其它的源程序一起编译,也可以被操作系统载入内存执行。

这样,在提供一些函数和类的时候,就可以仅仅提供库文件,而非提供.cpp源文件,安全性就得到了保证。

其中,库文件又分为静态库和动态库。

2.静态库

1.简介

静态库是指,主程序文件会和这个库文件一同编译链接生成到.o目标文件中。这样做的好处就是,生成的可执行文件可以独立运行,因为它所需要的函数和类都已经包括在内。

但是如果对静态库的代码进行修改,必须重新生成静态库文件,再重新生成可执行文件。

2.命名方式

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

3.生成静态库

我们将一个.cpp文件变成一个.a静态库文件,用-c选项,只编译,而不链接。 例如一个yzz.cpp的源文件,我们可以这么生成它的静态库文件。

g++ -c -o libyzz.a yzz.cpp

4.调用静态库

方式一:直接使用静态库的文件名

g++ -o server server.cpp libyzz.a

方式二:-L指定静态库目录,-l指定静态库名字(不是文件名) 注意,静态库的名字不包含lib前缀也不包含.a后缀

g++ -o server server.cpp -L/home/util -lyzz

要指定多个静态库目录或者静态库文件,需要使用多次-L和多次-l

3.动态库

1.简介

静态库是直接和主程序代码编译链接生成目标文件,那么动态库就不是。动态库是在程序运行的时候,才会被载入。

那么动态库的好处就是,如果对动态库的代码进行修改,只需要重新-c选项编译动态库即可,不需要重新编译生成可执行程序。

2.命名方式

前缀一样是"lib",后缀是".so",和静态库有一些不同。

3.生成动态库

g++ -fPIC -shared -o libyzz.so yzz.cpp

其中,-shared表示依赖的文件可以是目标文件、汇编文件、.cpp源文件。 而-fPIC,告诉编译器产生与位置无关代码,则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

4.调用动态库

一共有三种方式,前两种和静态库调用是一致的。

多出来的一种,是Linux系统中采用LD_LIBRARY_PATH环境变量指定动态库文件的目录。 这个我没有详细去了解,可以到翻到下面动态库的部分去了解。

经验分享 程序员 微信小程序 职场和发展