我们在日常编码中,可能会出现这样一种情况:我们要将我们写好的函数或者类提供给别人,但是我们只想给他提供接口而不想让他了解到函数的具体细节。这时我们可以将我们的函数封装成库然后和头文件一起提供给他,这样他按照接口的说明文档就可以使用了,但是无法了解到内部是如何实现的。
编写库文件
有一个文件夹名为cppSpace,里面有一个helloWorld.h和helloWorld.cpp文件,helloWorld.h内容如下:
#ifndef LIBHELLOWORLD_H_
#define LIBHELLOWORLD_H_
void printHello();
#endif
helloWorld.cpp内容如下:
#include<iostream>
using namespace std;
void printHello()
{
cout<<"Hello world!"<<endl;
}
现在我们在cpp文件夹下新建一个名为CMakeLists.txt的文件,并在里面添加如下内容:
# add_library(程序名 源代码文件)
add_library( hello helloWorld.cpp )
add_library( hello_shared SHARED HelloWorld.cpp )
add_library()的意思就是将helloWorld.cpp封装成静态库,加上SHARED就是生成共享库。
现在我们在cpp文件夹下新建一个文件夹名为build,然后切换到build文件夹下,使用cmake对其进行编译。在终端中输入:
cd build
cmake ..
make
执行完后,build目录下就会出现libhello.a(静态库)和libhello_shared.so(共享库)。
cppSpace文件夹的树目录如下图所示:
库的调用
现在我们已经有了helloWorld.h头文件和libhell.a库,我们将这两个文件提供给别人,那么别人该如何使用呢?
我们新建一个名为cpp的文件夹,将helloWorld.h和libhell.a拷贝到cpp文件夹下,并且在cpp文件夹下新建useHello.cpp文件,添加以下内容:
#include "helloWorld.h"
int main()
{
printHello();
return 0;
}
可以看到,在useHello.cpp中我们调用了printHello()函数,要想该函数被成功调用,我们还需要在编译时链接到库文件libhello.a。
创建CMakeLists.txt文件,加入以下内容:
link_directories(/home/user/cpp) # 这个路径就是存放.a文件的路径
add_executable( useHello useHello.cpp )
target_link_libraries( useHello libhello.a ) # 建立与库文件的链接
然后再cpp文件夹下新建build文件夹,进入build文件夹,执行下面指令
cmake ..
make
./useHello
终端成功输出:
Hello world!
cpp文件夹的树目录如下图所示:
参考链接:https://mp.weixin.qq.com/s/QgT0L49R2VkmCkWxFxnnvQ