【C++ 学习】库文件和头文件编写

库文件和头文件编写

有时候,通过C++编写的代码并不一定是直接在自己的控制台文件调用,而是需要在其他程序中调用编写的算法的接口即可。这个时候,可以把自己编写的代码打包成一个库(Library),编译后被其他程序调用。库一般是许多算法和程序的集合。

本文记录库文件和头文件编写过程。
本文通过clion来创建项目,可以在创建项目的时候选择自己的库文件是共享链接库或者静态链接库。
静态库:静态库每次调用时都会生成一个副本,比较占空间。
共享库:在多次调用时只会产生一个副本,节省空间,生成共享库的方法是在CMakeList.txt文件中加入以下指令:

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

即关键字SHARED

基础的CMakeList.txt中的内容

cmake_minimum_required(VERSION 3.24)
project(LibraryCodeLearn)set(CMAKE_CXX_STANDARD 17)add_library(LibraryCodeLearn SHARED library.cpp)

cmake_minimum_required 告诉计算机要编译CMakeList.txt的最小CMake版本。
project 则表明项目名
set(CMAKE_CXX_STANDARD 17) 设置编译器的C++标准,当前项目使用的是C17标准。

引入第三方库的方法

要引入第三方库,首先要下载好第三方库的源代码。并放在项目指定的目录下。

以引入OpenCV库为例,从OpenCV的官网(https://opencv.org/)下载好源代码。并将其解压到项目指定的目录,或是某个集中配置的目录。

通过添加以下代码到CMakeList.txt中引入OpenCV

#引入OpenCV
set(OpenCV_DIR opencv/build)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})add_library(LibraryCodeLearn SHARED library.cpp)
target_link_libraries(ProgramName ${OpenCV_LIBS})

set(OpenCV_DIR opencv/build) 制定了OpenCV的build目录,find_package(OpenCV REQUIRED) 指定程序需要先找到OpenCV库,REQUIRED 要求程序必须找到该库,否则会报编译错误。include_directories(${OpenCV_INCLUDE_DIRS}) 将OpenCV库的头文件目录包括进来,target_link_libraries(ProgramName ${OpenCV_LIBS}) 指定链接到的库

编写头文件

头文件是C、C++程序中重要的组成部分,通常会将.h头文件和.cpp文件放在不同的文件夹,常见的储存方式是.h文件放在include中,.cpp文件放置在src文件中。
在include文件下,新建一个libHelloWorld.h文件。clion会生成一些内容


#ifndef UNTITLED_LIBHELLOWORLD_H
#define UNTITLED_LIBHELLOWORLD_H
//进行宏定义是为了防止重复引用头文件而引起重定义错误
#endif //UNTITLED_LIBHELLOWORLD_H

该宏定义过程为

#ifndef 大写头文件名_H
#define 大写头文件名_H#endif

可以向对应的.cpp文件中写入函数,并在头文件中声明。
.cpp文件中代码如下

#include <iostream>using namespace std;void printHello()
{cout << "Hello world!"<< endl;
}

并在对应的头文件中声明

#ifndef UNTITLED_LIBHELLOWORLD_H
#define UNTITLED_LIBHELLOWORLD_H
void printHello();
#endif //UNTITLED_LIBHELLOWORLD_H

通过编译,即可生成动态链接库.so文件。

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

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

相关文章

宝塔Python3.7安装模块报错ModuleNotFoundError: No module named ‘Crypto‘解决办法

前言 今晚遇到一个问题&#xff0c;宝塔服务器上安装脚本的模块时&#xff0c;出现以下报错&#xff0c;这里找到了解决办法 Traceback (most recent call last):File "/www/wwwroot/unifysign/fuck_chaoxing/fuck_xxt.py", line 4, in <module>from Crypto.…

[SQL开发笔记]BETWEEN操作符:选取介于两个值之间的数据范围内的值

一、功能描述&#xff1a; BETWEEN操作符&#xff1a;选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。 二、BETWEEN操作符语法详解&#xff1a; BETWEEN操作符语法&#xff1a; SELECT column1, column2,…FROM table_nameWHERE column BETWEEN val…

基于aop 代理 Sentinel Nacos配置控制包装类实现原理

基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理 Hi&#xff0c;我是阿昌&#xff0c;今天记录下看sentinel源码结合业务实现的思路基于aop & 代理 & Sentinel & Nacos配置控制包装类实现原理&#xff1b;下面并不会手把手的记录方案的实现…

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

分享一个用HTML、CSS和jQuery构建的漂亮的登录注册界面

作为一个前端开发人员&#xff0c;我们经常需要构建用户的登录和注册界面。一个漂亮、用户友好的登录注册界面对于提升用户体验和网站形象至关重要。以下我们使用HTML、CSS和jQuery来做一个漂亮的登录注册界面。 首先&#xff0c;我们需要创建一个html文档&#xff0c;定义登录…

【算法练习Day29】柠檬水找零根据身高重建队列用最少数量的箭引爆气球

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 柠檬水找零根据身高重建队列…

【数据结构】ST 表与 RMQ 算法

本文参考【朝夕的ACM笔记】数据结构-ST表 在练习线段树的过程中经常会感叹代码怎么这么长啊啊啊懒标记怎么这么难传啊啊啊 于是在得知有一种代码量远小于线段树的算法时、、、&#xff08;其实是因为做到了[SCOI2007] 降雨量 就是ST表啦~ 在什么情况下可以用ST表代替线段树…

Web进阶

身份认证 当我们在使用互联网时&#xff0c;经常会遇到一些需要身份验证或者保持用户状态的情况。为了实现这些功能&#xff0c;常用的方法有使用cookie、session和token。 Cookie&#xff08;HTTP Cookie&#xff09;&#xff1a; Cookie是服务器发送到用户浏览器并保存在用户…

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码&#xff08;8位&#xff09; 中文编码&#xff08;16位&#xff09; GB2312标准 GBK编码 GB18030标准&#xff08;32位&#xff09; Big5编码 Unicode字符集和编码 UTF-32&#xff08;32位&#xff09; UTF-16&#xff08;16位/32位&#xff0…

二十三、设计模式之组合模式![

目录 二十三、设计模式之组合模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…

方舟生存进化ARK个人服务器搭建教程保姆级

方舟生存进化ARK个人服务器搭建教程保姆级 大家好我是艾西&#xff0c;在很久之前我有给大家分享过方舟生存进化的搭建架设教程&#xff0c;但时间久远且以前的教程我现在回头看去在某些地方说的并不是那么清楚。最近也是闲暇无事打算重新巩固下方舟生存进化的搭建架设教程&…

Vue 路由传参和获取参数的方法

在使用 Vue 进行开发时&#xff0c;路由传参是非常常见且重要的功能。通过路由传参&#xff0c;我们可以在不同的页面之间传递数据&#xff0c;以实现更灵活的交互和功能。 Vue 提供了多种方法来实现路由传参和获取参数的操作。下面将介绍两种常用的方法&#xff1a; 1. 动态…

rpc入门笔记0x01

syntax "proto3"; // 这是个proto3的文件message HelloRequest{ // 创建数据对象string name 1; // name表示名称&#xff0c;编号是1 }生成python文件 安装grpcio和grpcio-tools库 pip install grpcio #安装grpc pip install grpcio-tools #安装grpc tools生成…

LuatOS-SOC接口文档(air780E)--libcoap - coap数据处理

libcoap.new(code, uri, headers, payload) 创建一个coap数据包 参数 传入值类型 解释 int coap的code, 例如libcoap.GET/libcoap.POST/libcoap.PUT/libcoap.DELETE string 目标URI,必须填写, 不需要加上/开头 table 请求头,类似于http的headers,可选 string 请求体…

argparse模块介绍

argparse是一个Python模块&#xff1a;命令行选项、参数和子命令解析器。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义了所需的参数&#xff0c;而 argparse 将找出如何从 sys.argv &#xff08;命令行&#xff09;中解析这些参数。argparse 模块还会自动生成…

B-3:Web安全之综合渗透测试

B-3:Web安全之综合渗透测试 任务环境说明: 服务器场景:Server2104(关闭链接) 服务器场景用户名、密码:未知 1.通过URL访问http://靶机IP/1,对该页面进行渗透测试,将完成后返回的结果内容作为FLAG值提交; 通过访问IP/1,查看源代码发现flagishere,访问后发现什么也没…

【RabbitMQ】常用消息模型详解

文章目录 AMQP协议的回顾RabbitMQ支持的消息模型第一种模型(直连)开发生产者开发消费者生产者、消费者开发优化API参数细节 第二种模型(work quene)开发生产者开发消费者消息自动确认机制 第三种模型(fanout)开发生产者开发消费者 第四种模型(Routing)开发生产者开发消费者 第五…

jvm摘要

第 2 章 Java 内存区域与内存溢出异常 2.2 运行时数据区域 程序计数器-线程私有:是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。 程序计数器是唯一一个没有规定任何OutOfMemoryError 情况的区域。 Java 虚拟机栈-线程私有:用于执行Java …

悟空crm安装搭建 报错[0] RedisException in Redis.php line 56问题处理办法

相信很多朋友进行安装悟空crm的时候 提示错误&#xff1a; [0] RedisException in Redis.php line 56 Connection refused 不知道怎么样处理是吧~~~ $this->options array_merge($this->options, $options);}# redis 密码$password config(cache.password);if (!empty…

(二开)Flink 修改源码拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1&#xff09;定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a&#xff09;类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法&#xff1a; Override pu…