在C++程序中新建并使用库

news2024/9/19 10:50:11

创建一个新的cpp文件后,定义一个函数

        我们希望这个函数是可以被多个程序调用的,而不是直接输入在程序中进行编译。在C++程序中,不是所有代码都会被编译成可执行文件,只有main函数所在的程序才可以生成可执行文件。而这个库是通过上一节中的配置文件CMakeLists.txt文件中,通过add_library命令调用的,命令格式如下:

add_library(库名 文件名)

当使用add_library命令时,我们通过命令告诉CMake我们想要创建一个库。这个库可以是由一个或多个源文件编译而成的静态库或动态库。

例如,如果你有一个名为mylib的库,并且想要生成一个静态库(.a文件),你的CMakeLists.txt文件需要加入如下语句:

add_library(mylib lib.cpp)

这里,CMake将会编译lib.cpp文件并生成一个名为libmylib.a的静态库文件。

下面进行实操,如下图,我们把第一张图中的函数整体打包命名为一个叫Hello的库

随后进行编译

        编译后我们发现生成了一个多余的libHello.a的文件,.a文件是一个静态库文件,它包含了编译后的函数和对象的二进制代码。这个文件对我们之前所写的函数进行了一个“打包”,也就是我们得到的库,有了这个文件就可以调用我们之前所写的函数了,

  然而,仅仅有.a文件是不够的,因为我们还需要知道库中包含哪些函数以及如何正确地调用它们。这就引入了头文件(.h文件)的概念。

        头文件的作用是声明库中公开的函数和类的接口,它为开发者提供了必要的函数原型、类定义和其他相关的声明信息。当你想要使用静态库中的某个函数时,你需要在源代码中包含对应的头文件,这样编译器就能够理解函数的签名(即函数的返回类型、名称和参数类型),并确保你在源代码中对函数的调用是正确的。

为了顺利调用函数,还需要一个Hello.h的头文件来告诉程序库里面有这样一个函数。 

假设库中有一个函数void my_function(),头文件(mylib.h)大体格式如下:

#ifndef MYLIB_H
#define MYLIB_H

void my_function();

#endif // MYLIB_H

或者(与上面的表达意思一致)

#pragma once
void my_function();

同时,我们的CMakeLists.txt需要确保主程序链接到库:

add_executable(myapp main.cpp) 
target_link_libraries(myapp mylib)

这里,add_executable创建了一个名为myapp的可执行文件,target_link_libraries告诉CMake在链接时需要包含mylib库。

拓展:#pragma once 与 #ifndef 特性对比

特性#pragma once#ifndef
标准性非标准标准
跨编译器不一定支持广泛支持
实现机制编译器层面预处理器
防止重复单一编译单元全局
宏冲突风险

—————————————————————— 

        这个头文件声明了my_function函数的存在,但没有定义它。函数的定义通常在库的源文件(如lib.cpp)中给出,在我们的操作中就是libHello.cpp(第一个图)。在修改完配置文件后,通过vim Hello.h创建一个文件,按上面的格式要求编辑头文件。

        可以通过less命令查看并浏览文件内容,按q退出。至此,libHello.cpp和Hello.h构成了一个完整的库,可以进行调用,新建一个usehello.cpp文件并调用该头文件以及其包含的函数,程序如下。

然后需要创建可执行文件并确保CMakeLists.txt主程序链接到库

 编译:

 打开build文件夹后,文件如下,运行可执行文件,运行成功!

步骤总结:

1.新建一个.cpp文件并定义一个函数

        创建一个源文件,例如mylib.cpp,并在其中定义一个函数。

2.在配置文件CMakeLists.txt中通过add_library命令创建一个库:

        编辑CMakeLists.txt文件,使用add_library命令添加你的库,指定库的名称和源文件。

3.编译生成.a文件

        运行CMake来配置项目,并生成构建系统,然后使用构建系统编译库,生成库文件(如.a.so)。

4.新建一个头文件.h

        创建一个头文件,例如mylib.h,并在其中声明库中要公开的函数。

5.将CMakeLists.txt链接到库:

        在CMakeLists.txt中,使用target_link_libraries命令将你的可执行文件或库与新建的库链接起来。(假设你已经有一个可以利用该函数的cpp文件并在配置文件中配置完成)

6.编译并运行

        再次运行CMake和构建系统,编译整个项目,包括使用了新库的文件。

        运行生成的可执行文件,验证函数是否按预期工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(第三期)书生大模型实战营——书生大模型全链路开源开放体系

任务及教程来自书生大模型实战营https://github.com/InternLM/Tutorial

负载均衡、软件平滑升级

安装nginx 1.26.1 平滑升级、负载均衡 安装依赖 gcc gcc-c pcre-devel openssl-devel 七层负载均衡配置: [rootf ~]# vim /usr/local/nginx/conf/nginx.conf 43 location / {44 # root html;45 # index index.html index…

在docker中安装MongoDB 5.0+

文章目录 1、查看物理机是否支持avx指令集:安装资料中的cpu-z_2.10-cn.exe,并打开2、查看虚拟机是否支持avx指令集:3、创建目录4、使用Docker来运行一个MongoDB数据库实例5、进入容器6、查看当前db版本7、查看当前db的链接机器地址8、帮助指令…

《昇思25天学习打卡营第24天》

接续上一天的学习任务,我们要继续进行下一步的操作 构造网络 当处理完数据后,就可以来进行网络的搭建了。按照DCGAN论文中的描述,所有模型权重均应从mean为0,sigma为0.02的正态分布中随机初始化。 接下来了解一下其他内容 生成…

程序一调用这个接口就会崩溃, 因为他的静态库添加是放在release文件下,而我用的debug模式

程序一调用这个接口就会崩溃 因为他的静态库添加是放在release文件下 而我用的debug模式 DESTDIR ../x64/ReleaseINCLUDEPATH ./../3rdparty/ZZDecode/include LIBS -lopengl32 \-lglu32 \-luser32 \./../3rdparty/ZZDecode/x64/release/ZZDecodeInterface.lib

华为仓颉语言测试申请

1. 申请网址 HarmonyOS NEXT仓颉语言开发者预览版 Beta招募- 华为开发者联盟 点击立即报名登录华为账号 勾选选项 , 点击同意 按要求填写信息即可 2. 申请通过后官方会通过邮件的方式发送相关下载途径 , 根据文档进行下载即可 package Cangmain(): Int64 {println("你…

Springboot使用Redis实现分布式锁

1、使用场景和实现方案: 使用场景:本地锁如Lock和Syncronized只能锁住本地进程,在分布式应用中,需要使用分布式锁来更好实现特定的业务。 实现方案:有多种,比如使用mysql、zookeeper、redis,各…

nginx续1:

八、虚拟主机配置 基于域名的虚拟主机 [rootserver2 ~]# ps -au|grep nginx //查看进程 修改Nginx服务配置,添加相关虚拟主机配置如下 1. [rootproxy ~]# vim /usr/local/nginx/conf/nginx.conf 2. .. .. 3. server { 4. listen …

基于Material studio拉伸-断裂过程的Perl脚本

在材料科学的研究中,拉伸-断裂过程一直是科学家们探索的焦点。这一过程涉及复杂的力学行为和材料内部微观结构的变化,对于理解材料的性能至关重要。然而,传统的实验方法不仅耗时耗力,而且难以捕捉到微观尺度上的所有细节。 为了满…

jQuery前端网页制作

1、Jquery的概述 1.1JavaScript库 JavaScript 高级程序设计(特别是对浏览器差异的复杂处理),通常很困难也很耗时。 为了应对这些调整,许多的 JavaScript (helper) 库应运而生。 这些 JavaScript 库常被称为 JavaScript 框架。 市面上一些广受欢迎的 JavaScript 框架:…

visual studio性能探测器使用案列

visual studio性能探测器使用案列 在visual studio中,我们可以使用自带的工具对项目进行性能探测,具体如下 1.选择性能探查器 Vs2022/Vs2019中打开方式: Vs2017打开方式: 注意最好将解决方案配置为:Release Debu…

【未来餐饮】 配送设置

一、创建门店 关键信息 1. 门店名字要有辨识度,尽量不和其他客户重名 2. 地址要具体到门牌号 3. 定位要和上面的地址一致 可以复制地址搜索地图,然后选择位置 二、创建配送模板 新建模板 填写模板 命名模板,勾上真省钱,然后保…

Meta再下一城:SAM 2

--->更多内容&#xff0c;请移步“鲁班秘笈”&#xff01;&#xff01;<--- “继用于图像的Meta Segment Anything Model &#xff08;SAM&#xff09;取得成功之后&#xff0c;我们发布了SAM 2&#xff0c;这是一种用于在图像和视频中实时进行对象分割的统一模型&#…

npm创建vue的ts项目

一、进入项目文件夹 使用cmd进入你想要创建项目的文件夹&#xff0c;此处为 E盘的test文件夹 cd E:\testE:二、创建项目 此处项目名为 MyTestProject npm create vitelatest输入上述代码&#xff0c;回车后会出现灰色的虚拟名称&#xff0c;此处输入你自己的名称即可&#…

软件平台化开发项目实践

汉捷咨询有40多位来自多家著名企业&#xff08;华为、中兴、三星等&#xff09;的咨询顾问和讲师&#xff0c;资深顾问/项目经理均有华为、中兴等领先企业高管及咨询实践15年以上经验&#xff0c;本文为汉捷一IPD资深顾问的行业实践总结&#xff0c;与各位同仁分享&#xff01;…

WPF用户登录界面设计-使用SQLite数据库进行存储

一、SQLite数据库介绍 SQLite是一款轻量级的关系型数据库&#xff0c;它小巧高效&#xff0c;无需服务器配置&#xff0c;仅需单一文件即可存储数据。SQLite跨平台支持&#xff0c;易于集成到各种应用程序中&#xff0c;并支持SQL语言进行数据操作。它保证了数据的完整性、一致…

Java数据结构和算法中文版(第2版)详细教程

前言 数据结构是指数据在计算机存储空间中(或磁盘中)的安排方式。算法是指软件程序用来操作这些结构中的数据的过程。几乎所有的计算机程序都使用数据结构和算法&#xff0c;即使最简单的程序也不例外。比如设想一个打印地址标签的程序&#xff0c;这个程序使用一个数组来存储…

整理几个常用的Linux命令(Centos发行版)

如果工作中需要经常整理一些文档&#xff0c;需要汇总一下&#xff0c;现有的服务器资源信息&#xff0c;那么这篇文章适合你&#xff1b; 如果你是一名开发者&#xff0c;需要经常登录服务器&#xff0c;排查应用的出现的一些问题&#xff0c;那么这篇文章适合你&#xff1b;…

使用java判断字符串中是否包含中文汉字

1.导入huool工具的maven依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.复制一下代码直接运行 import cn.hutool.core.lang.Validator;public …

面向对象 - 概述、类的创建、 实例化与内存解析

一、学习面向对象的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…