前言
欢迎来到我的博客
个人主页:北岭敲键盘的荒漠猫-CSDN博客
本文主要整理visual studio C++导入第三方库的注意事项与操作
bilibili配套视频:【visual studio C++导入第三方库-哔哩哔哩】 https://b23.tv/vphfXnv
运行库选项
右键项目 -> 属性 -> C/C++ ->代码生成->运行库
可以看到在debug模式下他有四个选项。
MT,MD与MTd,MDd的区别
debug模式生成的可执行文件会比较大,方便我们调试使用。
release模式文件体积小,适合作为发行版。
这里的MTd,MDd后面带了d的就是debug模式的生成。
debug模式下默认使用的是MDd,release下默认使用MD。
MT与MD的区别
配置类型 | MT(/MT、/MTd) | MD(/MD、/MDd) |
---|---|---|
全称 | 多线程静态运行时库 | 多线程动态运行时库 |
运行时依赖 | 无需额外DLL | 需微软运行时DLL(如msvcp140.dll ) |
文件体积 | 主程序较大(运行时库代码嵌入其中) | 主程序较小(运行时库代码在DLL中共享) |
适用场景 | 绿色单文件部署、嵌入式系统 | 多程序共享DLL、依赖系统运行时环境 |
直观点:
MT就是相当于把所有代码写在一个文件里,它可以直接执行。
MD就是分文件编写程序,缺一个文件就无法执行。而这里的文件实际上是DLL文件。
推荐查阅内容:
Visual Studio C++ 常用配置变量表-CSDN博客
第三方库导入案例
导入三步走
1.导入头文件
2.添加依赖目录
3.添加依赖文件
Crypto++导入案例
特点:下载自带visual studio工程,依赖动态lib。
下载:https://github.com/weidai11/cryptopp/releases/tag/CRYPTOPP_8_9_0
下载下来后文件夹里很多文件
有一个sln解决方案文件。
点开里面有四个项目
我们先看一下他是什么配置
MT静态配置,release,x64,这个东西的配置要跟我们的项目一样。
我们都用默认的演示吧。
lib就是链接文件,所以我们要生成cryptlib项目。
生成完毕。
我们要用这个第三方库需要用这个。
现在创建我们的项目。
这里我创建一个lib,一个include文件夹。
lib用来存放lib文件,include用来存放文件头。
(当然这个不是必须的,可以根据自身喜好做)
现在配置解决方案选项。
这个改成OutDir,这个是文件的运行环境,OutDir就是他生成exe的文件夹,所以我们的相对路径就在exe文件所在的目录,原本是在项目目录。
包含目录配置好,存放文件头。(这里就是include文件夹的路口)
添加lib存放目录。
(我们调试有时候会用debug,有时候用release,所以可以两个模式一起编译,然后分开放)。
$(SolutionDir)lib\$(ProjectName)\$(Platform)\$(Configuration)
即:解决方案目录\lib\项目名称\x64\Release
我们再创建好文件夹,把之前生成的lib复制过来。
现在我们只是选择了链接目录,还需要选择链接的文件。
所以在这里填写文件。
这样基本都是配置完成了。
接下来是把文件头全部复制到include中。
这里你看,直接复制进来是不是文件太多了。
这是一个第三方库,如果很多库呢,他们有重名的怎么办,所以这时候我们创建一个文件夹。
把这个库的文件全部放到文件夹中。
然后我们导入的时候添加一个相对路径。
现在我们写个程序进行测试。
#include <iostream>
#include <cryptopp/aes.h> // 包含AES算法头文件
#include <cryptopp/cryptlib.h> // 核心库头文件
#include <cryptopp/modes.h> // 包含模式操作头文件
using namespace CryptoPP;
int main() {
try {
std::cout << "Crypto++ Library Test:" << std::endl;
// 验证AES算法支持
std::cout << "AES Block Size: " << AES::BLOCKSIZE << " bytes" << std::endl;
// 验证基础加密对象创建
ECB_Mode<AES>::Encryption encryptor; // 修复问题:确保包含 modes.h 头文件
std::cout << "ECB AES Encryptor initialized successfully." << std::endl;
return 0;
}
catch (const CryptoPP::Exception& e) {
std::cerr << "Crypto++ Error: " << e.what() << std::endl;
return 1;
}
catch (const std::exception& e) {
std::cerr << "Standard Exception: " << e.what() << std::endl;
return 1;
}
catch (...) {
std::cerr << "Unknown error occurred." << std::endl;
return 1;
}
}
执行成功。
spdlog导入案例
特点:下载只有源码没有工程,纯静态不依赖lib。
库地址:https://github.com/gabime/spdlog
下载下来文件结构如下:
可以看到,他有CMakeLists.txt文件,但是没有现成的项目。
所以我们要先构建项目。
我们先构建我们Exper的项目。
好,这里我们要去构建spdlog的visual工程。
我们在他的目录创建一个build文件夹
我们在build文件夹中构建项目。
我们使用cmake工具构造项目。在build中打开cmd命令行输入这个构建
cmake .. -G "Visual Studio 17 2022" -A x64
cmake:启动cmake工具
..:在build的上一级目录启动
-G "Visual Studio 17 2022":选择2022编译器(根据你的visual版本而定)
-A x64:生成64位项目。
cmake会在你安装visual studio的C++环境的时候自动安装。
如果你发现没有的话。
这是因为新版本他不会直接把这些工具放到全局环境中。
你可以用visual studio专门开发者的cmd环境操作。
打开方法如下:
好cd到build目录执行就行了
执行完毕会出现sin项目
这种就能编译好了。
不过这种是针对相同类型的库。
但是spdlog很特殊。
零编译依赖
spdlog是典型的头文件库(Header-only library),所有实现代码都包含在.hpp
文件中,编译器在预处理阶段直接将代码嵌入到你的源文件中。自动实例化机制
模板类在首次使用时自动实例化(如spdlog::info
创建logger
对象),无需提前编译二进制文件。
所以这个库只需要你直接include个头文件就能用。
include里的文件直接放进去。
配置好
直接运行。
报错utf-8
这个框架强制要求utf-8
添加一下这个
直接运行。
代码:
#include "spdlog/spdlog.h"
int main()
{
spdlog::info("Welcome to spdlog!");
spdlog::error("Some error message with arg: {}", 1);
spdlog::warn("Easy padding in numbers like {:08d}", 12);
spdlog::critical("Support for int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}", 42);
spdlog::info("Support for floats {:03.2f}", 1.23456);
spdlog::info("Positional args are {1} {0}..", "too", "supported");
spdlog::info("{:<30}", "left aligned");
spdlog::set_level(spdlog::level::debug); // Set global log level to debug
spdlog::debug("This message should be displayed..");
// change log pattern
spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");
// Compile time log levels
// Note that this does not change the current log level, it will only
// remove (depending on SPDLOG_ACTIVE_LEVEL) the call on the release code.
SPDLOG_TRACE("Some trace message with param {}", 42);
SPDLOG_DEBUG("Some debug message");
}
完美