首先来了解下库文件的基础概念。
库文件是一些预先编译好的操作集合(包括函数与类)。
库文件主要有下面3种好处:
1.模块化, 将一些功能模块化,有利于项目的分工与管理。
2.可从用性高,库里面的功能不需要关心其实现,不需要关心其实现。(研究源码及学习除外)
3.可维护性高,当项目改变时,我们对库文件基本不需要重新编译。
linux下面的头文件和库文件的默认路径主要是下面4个:
1./usr/include及其子目录下面的文件夹 2./usr/local/include及其子目录下面的文件夹 3./usr/lib 4./usr/local/lib
下面简单的说明下g++在编译项目时如何链接库函数。
先看下下面的代码:
#include <iostream>
#include <math.h>
using namespace std;
int main(int argc, char *argv[])
{
double x = pow(2, 3);
cout<<"double x = "<< x <<endl;
return 0;
}
这里面我引用了系统的math.h库文件.这个时候g++编译项目中如何链接库文件呢
使用下面的命令:g++ -Wall main.cpp -o main -lm 其中-l表示链接库文件, m表示链接的时libm.so或libm.a文件. 使用的时候前面的lib可以不写。
下面说明下.so文件与.a文件的区别.
1.a文件表示静态库
静态库在程序编译链接的时候把库的代码链接到可执行文件中,在程序的运行的时候不需要静态库文件。
2.so文件表示是动态库.
动态库又称为共享库。程序在使用的时候才去链接共享库的代码。多个程序可共享动态库的代码。在程序运行的时候 需要动态库(不然程序会出现问题)。
一个动态库链接的可执行文件仅仅只是包含它用到的函数入口的一个表,而不是外部函数的目标文件的整个代码。在运行之前,调用的函数代码由操作系统从磁盘上的动态库中复制带内存中,这个过程就叫动态链接。
动态库可以在多个程序间共享,所以动态库使用的执行文件更小,而操作系统采用了虚拟内存机制允许内存中的一份动态库被该进程使用,节省了内存空间。
如何生成库文件呢?
例如我们用一个fun.h和fun.cpp文件
1.我们需要生成一个.o文件
g++ -Wall -c fun.cpp -o fun.o
2.利用ar rcs命令才生成一个.a文件
ar rcs libfun.a fun.o
利用g++ 编译链接程序
g++ -Wall main.cpp libfun.a -o main即可
还有另一种方式来链接g++ -Wall main.cpp -o main -lfun。但是这样就有一个问题,提示我们无法找到库文件,这是由于这种链接方式会去系统默认的文件夹里面去找库文件。
这样就需要添加选项,g++ -Wall -L. main.cpp -o main -lfun。-L. 表示编译的库文件在当前文件夹里面。
下面介绍如何生成动态库文件。
1.我们需要生成一个.o文件
g++ -Wall -c fun.cpp -o fun.o
2.g++ -shared -fPIC fun.o -o libfun.so即可.