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环境变量指定动态库文件的目录。
这个我没有详细去了解,可以到Linux静态库与动态库翻到下面动态库的部分去了解。