C++库文件和头文件编写教程


「本文介绍了在Linux系统下生成库文件,以及编写头文件来使用该库函数」


1.编写库文件


我们知道C++工程在编译时,含有main()函数的文件会被生成可执行程序。而那些不含main()函数的代码,编译后一般是被其他程序调用,因此我们可以把他们打包成一个“东西”,即为库(Library)。

库一般是许多程序和算法的集合,例如openCV库包含了很多计算机视觉相关算法,Eigen库提供了很多矩阵代数计算的算法。

我们以一个简单的c++文件为例演示如何编写一个库。

在根目录下新建一个cppSpace文件夹,并在该文件夹中新建如下的libHelloWorld.cpp文件:

//不含main()函数的库文件#include <iostream>using namespace std;
void printHello(){ cout << "Hello world!"<< endl;}

该库文件较为简单,只提供了一个printHello()函数,调用该函数将得到一条输出信息。

根据cmake的原理,我们在CMakeLists.txt文件中加入以下指令:

#该指令语法格式:add_library( 程序名  源代码文件 ) add_library( hello libHelloWorld.cpp )

该命令告诉cmake,我们想把该文件编译成一个叫"hello"的库。接下来使用cmake对该工程进行编译,在终端中输入:

cd buildcmake ..make

运行完以上指令后,目录中生成了一个libhello.a的文件,即我们的库,该库类型为静态库,静态库每次调用时都会生成一个副本,较占空间。而共享库在多次调用时只产生一个副本,节省空间,生成共享库的方法是在CMakeLists.txt文件中加入以下指令:

add_library( hello_shared SHARED libHelloWorld.cpp )

再次使用cmake对该工程进行编译,就将得到libhello_shared.so文件,此即共享库文件。

如果仅有以上两种格式的文件,我们并不知道里面函数时什么形式的,也不知如何调用他们,为了能让大家使用这些库函数,我们需要编写一个头文件,说明这些库里有些什么。对于使用者,只要在程序中声明了该头文件,就可以调用这个库。


2.编写头文件


头文件是C++程序中开头部分的重要指令,下面以编写libhello.a的头文件为例说明其编写和使用的过程。

在该文件夹(cppSpace文件夹)下,新建libHelloWorld.h头文件:

#ifndef LIBHELLOWORLD_H_#define LIBHELLOWORLD_H_//进行宏定义时为了防止重复引用头文件而引起重定义错误void printHello();   //声明包含的库函数#endif

编写得到了我们的头文件libHelloWorld.h,接下来编写一个可执行程序useHello.cpp来调用他:

#include "libHelloWorld.h"    //声明头文件int main(){    printHello();    return 0;}

要想使该库函数被成功调用,我们还需要在编译时连接到库文件libhello.a中,即在CMakeLists.txt文件中加入以下指令:

#正常对useHello.cpp文件进行编译add_executable( useHello useHello.cpp )#建立与库文件的链接(注意!添加的是库文件的名称,不是头文件的名称)target_link_libraries( useHello hello )

这样,文件useHello.cpp就可以使用hello.a库文件中的库函数了。

至此,库文件和头文件的编写及使用过程就介绍完了。

相关推荐

  • 10节课+200篇论文!实战深度学习热门领域
  • 直播来袭 | 微盟技术沙龙-数字化时代下的SaaS SCRM系统实战
  • 国美APP抽奖弹窗辱骂创始人;小米14系列或搭载MIOS;知名开发者遭微软MVP项目组除名;DHH锐评:前端根本不需要构建
  • 我用过很多代码生成器,还是选了他
  • 2023 年 Serverless 状态报告发布:采用率大幅增长
  • 代码生成:基于 AI 大模型的挑战与前景
  • 创新风潮迭起,2023深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛正式启动
  • 谷歌如何释放和衡量开发人员的生产力
  • 大模型时代下的技术变革:训练、负载、部署、效率、安全……都遇到了新挑战?
  • 20 个最频繁使用的 Python 代码片段
  • GPT-4肆虐「谁是卧底」桌游!交谈逼真,类人属性仍有发展空间
  • 碾压GPT-4,微软最强AutoGen爆火!多个智能体协作,编码速度飙升4倍,GitHub狂揽10k星
  • 百度谷歌成为AI黄埔军校,Transformer八子融资超8.7亿刀!「AI行业全景报告」总结GenAI大爆发
  • 再阉割H800?美商务部新政加强限制GPU出口,预计本周公布
  • 英伟达爆火智能体研究:AI逼真还原人类情感!会饿会孤独,会跑步会发火
  • YOLO再升级!华为诺亚提出Gold-YOLO,聚集-分发机制打造新SOTA
  • 靠发AIGC论文拿了100万年薪!不是靠努力和勤奋,而是......
  • 数据科学的业务价值转化秘籍
  • AB实验的关键变量
  • 信息流场景下的AIGC实践