Visual Studio C++引入第三方库

发布于:2025-04-18 ⋅ 阅读:(35) ⋅ 点赞:(0)

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-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很特殊。

  1. 零编译依赖
    spdlog是典型的头文件库(Header-only library),所有实现代码都包含在.hpp文件中,编译器在预处理阶段直接将代码嵌入到你的源文件中。

  2. 自动实例化机制
    模板类在首次使用时自动实例化(如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");
}

完美

 

 

 


网站公告

今日签到

点亮在社区的每一天
去签到