使用boost库

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、boost实例代码
  • 二、vs配置boost库
    • 1.linux环境
    • 2.windows环境
      • 2.1.源码编译
      • 2.2vs配置
      • 3.3程序运行
      • 3.4将程序编译成静态库
        • 3.4.1静态库和动态库知识点
        • 3.4.2编写代码
        • 3.4.3修改代码
      •  3.5使用静态库
        • 3.5.1 使用方式一:代码配置后使用(隐式加载)
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、boost实例代码

参考这个帖子编写实例代码:C++ Boost主要特性介绍以及示例代码 - 知乎。

该代码使用的是boost库的filesystem

#include <iostream>

int main() {

	boost::filesystem::path path("test.txt");

	if (boost::filesystem::exists(path)) {

		std::cout << "File exists." << std::endl;

	}

	else {

		std::cout << "File does not exist." << std::endl;

	}

	return 0;
}

新建vs工程,创建控制台程序,报错,下面查找资料怎么在vs配置boost库

二、vs配置boost库

1、linux环境

2、windows环境

vs配置boost库即是在windows平台使用boost,可以编译成静态库,也可以编译成动态库吧

在vs配置boost库有直接用安装包安装源码编译安装两种。

2.1.源码编译

源码编译安装需要自行编译

源码编译安装参考此帖子:开源库windows平台编译-CSDN博客

2.1.1下载boost库

下载链接:Boost C++ Libraries - Browse Files at SourceForge.netFree peer-reviewed portable C++ source librariesicon-default.png?t=N7T8https://sourceforge.net/projects/boost/files/

进入下载页面https://sourceforge.net/projects/boost/files/boost/1.82.0/

 解压后,双击bootstrap.bat文件,等待生成b2.exe文件,生成完成

 双击b2.exe文件,生成静态库和动态库。等待大概十分钟,窗口会自动消失。

确认是否生成bin.v2文件夹和stage文件夹,生成即成功。

 2.2vs配置

在vs中配置如下,将包含目录、库目录和附加库目录指向boost安装目录

修改好后程序还是会报错

一番琢磨,发现是配置管理器没有改成x64,修改好编译就ok了,执行程序!

3.3程序运行

 成功!!

3.4将程序编译成静态库

增加工程代码量,增加智能指针相关代码,参考此贴:C++ Boost主要特性介绍以及示例代码 - 知乎

3.4.1静态库和动态库知识点

链接库概念详解
前言
首先,编程时,我们将存储可以重复使用的代码块文件称为库文件。比如c++常常导入的<stdio.h>,<match.h>等,这些都简称为库。根据应用程序使用库时的链接方式被划分为静态链接库和动态链接库两种。都符合PE文件格式下面为大家详细介绍。

1,静态链接库
(一)库格式
静态链接库(Static-Link Library)通常是以".lib"作为文件拓展名的二进制文件, 也可以是以".a"等;

(二)库内容
静态链接库在生成可执行文件前,将目标文件(.obj),运行时的函数库(.lib),已编译的资源文件(.res)等全部链接到了一起,打包成二进制文件。该文件包含运行时所需的所有代码。因此静态链接库是可以独立运行的(编译时加载);
包含文件:
xxx.h:生成静态链接库时的头文件,包含方法的声明;
xxx.lib :静态链接库,包含了一个或多个方法的具体实现代码的二进制文件;

(三)优,缺点
优点: 包含了全部运行时所需代码,可以独立运行移植性性强;
缺点: 若程序多次调用静态库中的同一代码块,则生成的可执行文件会重复加载此代码段,造成代码冗余,程序占用内存增大;

2,动态链接库
(一)库格式
动态链接库(Dynamic-Link Library)通常是以".dll"作为文件拓展名的二进文件,也可以是以".so",“.sys”,".drv"等;

(二)库内容
动态链接库在生成可执行文件前,将目标文件(.obj),运行时的函数库(.lib),已编译的资源文件(.res)等地址信息全部记录到文件中,打包成二进制文件。该文件包含运行时所需的代码块位置信息。因此动态链接库是不可以独立运行的(运行时加载);
包含
xxx.h:生成动态链接库时的头文件,包含方法的声明;
xxx.lib:动态链接库的导入库;包含了各个函数的地址信息;没有实现代码;
xxx.dll:动态链接库,包含了一个或多个方法的具体实现代码的二进制文件;

(三)优,缺点
优点:
1,若程序多次调用动态库中的同一代码块地址,则生成的可执行文件会加载相同地址的代码块,即使用的是同一块代码(共享代码);真正实现了运行时加载;同时避免了空间上的浪费;
缺点:
1,仅包含了全部运行时所需代码块地址,需要搭配相应的库文件。不可以独立运行,即移植性性强;
2,运行时加载代码块,需要通过动态库记录的地址去寻找相应地代码块,会使得程序性能下降(约%5);
参考文档:链接库dll,lib的创建及使用(超级详解)_lib文件生成_修道-0323的博客-CSDN博客

3.4.2编写代码

其中因为代码问题出现报错如下

boostTest.cpp

#include "boost/filesystem.hpp"
#include <iostream>

#include "smartPointer.h"

int smartPointerFunc() {

	boost::shared_ptr<MyClass> ptr(new MyClass);

	ptr->sayHello();

	return 0;
}

int main() {

	boost::filesystem::path path("test.txt");

	if (boost::filesystem::exists(path)) {

		std::cout << "File exists." << std::endl;

	}

	else {

		std::cout << "File does not exist." << std::endl;

	}

	smartPointerFunc();

	return 0;
}

smartPointer.cpp

//未引入smartPointer.h头文件

#include <iostream>

class MyClass {

public:

	void sayHello() {

		std::cout << "Hello, World!" << std::endl;
	}

};

smartPointer.h

#include <boost/shared_ptr.hpp>

#include <iostream>

class MyClass {

public:

	void sayHello();
};

报错如下:

严重性	代码	说明	项目	文件	行	禁止显示状态
错误	LNK2019	无法解析的外部符号 "public: void __cdecl MyClass::sayHello(void)" (?sayHello@MyClass@@QEAAXXZ),该符号在函数 "int __cdecl smartPointerFunc(void)" (?smartPointerFunc@@YAHXZ) 中被引用	boostTest	C:\Users\z30031397\source\repos\boostTest\boostTest\boostTest.obj	1	

修改smartPointer.cpp文件如下后编译正常。

#include <smartPointer.h>

#include <iostream>

void MyClass::sayHello() 
{
	
		std::cout << "Hello, World!" << std::endl;
}

目前,创建了一个较为复杂的工程。

3.4.3修改代码

因为静态库链接库没有main函数,所以需要修改代码。同时将工程名改成MyFirstLib。

同时将工程目录改成这样,

代码如下

//boostTest.cpp

#include <iostream>
#include "boostTest.h"
#include "smartPointer.h"

int boostTest() {

	boost::filesystem::path path("test.txt");

	if (boost::filesystem::exists(path)) {

		std::cout << "File exists." << std::endl;

	}

	else {

		std::cout << "File does not exist." << std::endl;

	}

	return 0;
}
//boostTest.h

#include "boost/filesystem.hpp"
#include <iostream>

int boostTest();
//smartPointer.cpp

#include <smartPointer.h>

#include <iostream>

void MyClass::sayHello() 
{
	std::cout << "smart pointer say: hello, World!" << std::endl;
}
//smartPointer.h

#include <boost/shared_ptr.hpp>

#include <iostream>

class MyClass {

public:

	void sayHello();
};

下面主要是参考此贴:https://blog.csdn.net/weixin_43821643/article/details/129415871

选择下述配置,编译器编译出来的项目结果就是链接库;

静态库创建:在项目MyLib属性页中,点击常规-》配置类型-》静态库(.lib)
动态库创建:在项目MyLib属性页中,点击常规-》配置类型-》动态库(.dll)

下面以静态库创建操作为例,如下图所示:

配置完成,点击生成,

打开文件夹

 3.5使用静态库

3.5.1 使用方式一:代码配置后使用(隐式加载)

创建vs工程名为libTest1项目,并编写代码

// libTest1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

#include "boostTest.h"				//步骤一:导入静态库对应的.h文件(相对于libTest1.cpp路径)
#include "smartPointer.h"			//步骤二:导入静态库(相对于libTest1.cpp路径)

#pragma comment(lib, "MyFirstLib")

int main()
{
	//smartPointerFunc2();
	//smartPointerFunc();
	boostTest();
    std::cout << "libTest1 test!\n";
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

需要单独指出的是,如果不在libTest1项目中配置boost库的路径,会报错。

但是刚才又试了一下好像又不需要了。看下图

运行情况如下

还遗留两个问题:

一、为什么smartPointerFunc()函数调用会失败。

二、新工程是否需要引入lib链接库以来的boost?


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单相过压继电器DVR-G-100-1 0~500V AC/DC220V 导轨安装

系列型号 DVR-G-100-1X3数字式过压继电器&#xff1b; DVR-G-100-3三相过压继电器&#xff1b; DVR(H)-G-100-1单相过压继电器&#xff1b; DVR-Q-100-3三相欠压继电器&#xff1b; DVR(H)-Q-100-3三相欠压继电器 一、用途 主要应用于电机、变压器等主设备以及输配电系统的继…

excel在函数中插入函数

例如&#xff0c;要计算RAND()1的值&#xff0c;其中RAND()表示取0~1之间的随机数。 插入-》函数&#xff1a; 选SUM函数&#xff1a; 点击“继续”&#xff1a; 将光标先放在数字1中的输入框中&#xff0c;然后在左边过滤出RAND函数&#xff0c;并且点击继续&#xff1…

jQuery Ajax前后端数据交互

ajax是用来做前后端交互的&#xff0c;前端使用ajax去去发送一个请求&#xff0c;后端给其响应拿到数据&#xff0c;前端做些展示。 浏览器访问网站一个页面时&#xff0c; Web 服务器处理完后会以消息体方式返回浏览器&#xff0c;浏览器自动解析 HTML 内容。如果局部有新数…

Python环境搭建与配置指南

Python 是一门优雅且健壮的面向对象解释型计算机程序编程语言&#xff0c;具有面向对象、可升级、可扩展、可移植、 语法简洁清晰易学、易读写、易维护、健壮性、通用性、跨平台等特点。目前广泛应用于人工智能、机器学习、 科学计算、大数据分析、图像处理、爬虫、区块链、自动…

【Android 】android13 新权限获取 读写文件权限

android13 新权限获取 参考&#xff1a;Android 13(API 33)读写SD卡权限的调整适配 - Mr,Han - 博客园 android在 获取文件读写权限&#xff08;尤其是音视频、图片等等资源&#xff09;的权限获取逻辑更换了。 必须申请如下权限&#xff1a; public static final String READ…

景联文科技入选量子位智库《中国AIGC数据标注产业全景报告》数据标注行业代表机构TOP20

量子位智库《中国AIGC数据标注产业全景报告》中指出&#xff0c;数据标注处于重新洗牌时期&#xff0c;更高质量、专业化的数据标注成为刚需。未来五年&#xff0c;国内AI基础数据服务将达到百亿规模&#xff0c;年复合增长率在27%左右。 基于数据基础设施建设、大模型/AI技术理…

asp.net考研加油站系统VS开发sqlserver数据库web结构c#编程web网页设计

一、源码特点 asp.net 考研加油站系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发。 asp.net考研加油站系统 应用技术…

threejs太阳系(源码加相关素材)

目录 前言 效果预览图 完整代码 html部分 js部分 模块aa 前言 Three.js 是一款基于原生 WebGL 封装通用 Web 3D 引擎&#xff0c;在小游戏、产品展示、物联网、数字孪生、智慧城市园区、机械、建筑、全景看房、GIS 等各个领域基本上都有 three.js 的身影。本篇文章简单的使…

Vue 简单的语法

1.插值表达式 1.插值表达式的作用是什么&#xff1f; 利用表达式进行插值&#xff0c;将数据渲染到页面中&#xff1b; 2.语法结构&#xff1f; {{表达式}} 3.插值表达式的注意点是什么&#xff1f; &#xff08;1&#xff09;使用的数据要存在&#xff0c;在data中&…

贪吃蛇小游戏代码

框架区 package 结果;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.s…

每日一题----昂贵的婚礼

#include <iostream> #include <algorithm> #include <cstring> #include <queue> #include <vector> using namespace std; //本题酋长的允诺也算一个物品,最后一定要交给酋长&#xff0c;那么等级不能超过酋长的等级范围const int N 150 * 15…

高效使用 PyMongo 进行 MongoDB 查询和插入操作

插入到集合中&#xff1a; 要将记录&#xff08;在MongoDB中称为文档&#xff09;插入到集合中&#xff0c;使用insert_one()方法。insert_one()方法的第一个参数是一个包含文档中每个字段的名称和值的字典。 import pymongomyclient pymongo.MongoClient("mongodb://l…

使用pixy计算群体遗传学统计量

1 数据过滤 过滤参数&#xff1a;过滤掉次等位基因频率&#xff08;minor allele frequency&#xff0c;MAF&#xff09;低于0.05、哈达-温伯格平衡&#xff08;Hardy– Weinberg equilibrium&#xff0c;HWE&#xff09;对应的P值低于1e-10或杂合率&#xff08;heterozygosit…

两万字图文详解!InnoDB锁专题!

前言 本文将跟大家聊聊 InnoDB 的锁。本文比较长&#xff0c;包括一条 SQL 是如何加锁的&#xff0c;一些加锁规则、如何分析和解决死锁问题等内容&#xff0c;建议耐心读完&#xff0c;肯定对大家有帮助的。 为什么需要加锁呢&#xff1f; InnoDB 的七种锁介绍 一条 SQL 是…

2023.11.16-hive sql高阶函数lateral view,与行转列,列转行

目录 0.lateral view简介 1.行转列 需求1: 需求2: 2.列转行 解题思路: 0.lateral view简介 hive函数 lateral view 主要功能是将原本汇总在一条&#xff08;行&#xff09;的数据拆分成多条&#xff08;行&#xff09;成虚拟表&#xff0c;再与原表进行笛卡尔积&#xff0c…

那些让我苦笑不得的 Bug:编码之路的坎坷经历

文章目录 1. CSS 中的样式“消失”问题2. JavaScript 的变量命名引发的混乱3. 时间格式的困扰4. 数据库查询条件引发的错误结语 &#x1f389;欢迎来到Java学习路线专栏~那些让我苦笑不得的 Bug&#xff1a;编码之路的坎坷经历 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨…

了解一下知识付费系统的开发流程和关键技术点

知识付费系统的开发既涉及到前端用户体验&#xff0c;又需要强大的后端支持和复杂的付费逻辑。在这篇文章中&#xff0c;我们将深入探讨知识付费系统的开发流程和关键技术点&#xff0c;并提供一些相关的技术代码示例。 1. 需求分析和规划&#xff1a; 在着手开发知识付费系…

小学生加减乘除闯关运算练习流量主微信小程序开发

小学生加减乘除闯关运算练习流量主微信小程序开发 经过本次更新&#xff0c;我们增加了新的功能和特性&#xff0c;以提升用户体验和运算练习的趣味性&#xff1a; 能量石与激励视频&#xff1a;用户可以通过观看激励视频来获取能量石&#xff0c;这些能量石可以用于解锁收费…

ctfshow 文件上传 151-161

文件上传也好久没做了。。 手很生了 151 前端绕过 只能上传png文件 使用bp抓包&#xff0c;修改文件名后缀为php 上传成功&#xff0c;发现文件上传路径 使用蚁剑连接 找到flag 152 152 后端校验 跟上一关一样 表示后面即使执行错误&#xff0c;也不报错 抓包修改文件…