提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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 librarieshttps://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提供了大量能使我们快速便捷地处理数据的函数和方法。