解析C++库文件(.a/.so)的生成方法以及与源文件(.cpp)、头文件(.h)的关系
在一个C++工程中,并非所有的代码都会被编译为可执行文件。只有带有main函数的文件才会生成可执行文件。而对于其他代码,我们只想将其大包围一个东西,供其他程序调用,这个东西就叫做库。生成库文件的过程如下。
1.库文件生成方法
首先,我们自己编写一个简单的代码libHello.cpp
//这是一个库文件
#include <iostream>
using namespace std;
void printHello(){
cout << "Hello!" << endl;
}
这个库提供了一个叫做printHello的函数,调用此函数之后回输出一条信息。但这个文件没有main函数,即这个库中没有可执行文件。
下面需要在CMakeLists…txt文件中输入如下内容
add_library(hello libHello.cpp)
add_library格式:
add_library(库名称 库文件)
这条命令的意思是告诉cmake在编译时要把这个文件编译成一个叫做"hello"的库,这时进入build文件夹下编译整个工程:
C++在Linux下的编译方法:Linux下的C++文件的编译方法
cd build
cmake ..
make
这时build文件夹下会生成一个libhello.a文件,该文件即为编译后得到的库文件。
同时,在Linux中库文件分为静态库(.a)和共享库(.so)两种,差别在于**静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。**生成共享库的语句如下:
add_library(hello_shared SHARED libHello.cpp)
此时编译后生成的文件即为共享库文件libhello_shared.so
2.库文件使用方法
库文件实质上是一个压缩包,里面有编译好的二进制函数。工程中只有库文件的话我们并不知道里面有哪些内容,为了使用这个库文件,需要提供一个头文件来说明库文件里面都有什么,同时只要拿到了头文件和库文件就可以通过调用头文件来使用这个库。这也是头文件和库文件之间的关系。
头文件libHello.h:
//下面这两个宏定义是为了防止重复引用这个头文件而引起重定义错误
#ifndef LIBHELLO_H_
#define LIBHELLO_H_
//打印Hello的函数
void printHeollo();
#endif
然后根据这个头文件和刚刚编译得到的库文件,就可以使用printHello函数进行输出。
#include "libHello.h"
int main(int argc, char **argv){
//直接调用头文件中的函数
printHello();
return 0;
}