C++入门学习(cmake、动态库、多态性)

C++编译连接问题总结(cmake库连接设置、环境变量设置与查看、C++静态库与动态库、软连接与硬链接) 一、静态库与动态库 1.1 静态库与动态库 预编译 --> 编译 --> 汇编 --> 链接 (1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开、处理条件编译指令、处理#include指令等。 (2)编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。 (3)汇编是将汇编代码转变成二进制文件。 (4)链接将二进制文件链接成一个可执行的命令,主要是把分散的数据和代码收集并合成一个单一的可加载并可执行.. 阅读详情

cmake入门了解 

编译器是什么?

编译器读取源代码,生成二进制文件

什么是IDE(集成开发环境)?如VC6.0、VS2012、CodeBlocks等。核心还是编译器,为了方便,全部免去命令形式的操作,取而代之的友好的界面,一键编译等方便的操作。

从.cpp文件到.exe过程

编写C++源代码,并保存为 .cpp 文件 -->编译器编译源代码文件,生成一个目标文件-->将目标文件与库一起链接(使用链接器如 ld、g++、clang++ 或 link.exe)-->生成可执行文件.exe并运行。

make、makefile、cmake、cmakelist的关系:

make作为工具对makefile中的命令进行编译和链接。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。cmake可以更加简单的生成makefile文件给上面那个make用。(最重要的是,可以跨平台生成对应平台能用的makefile。)cmake又要根据一个叫CMakeLists.txt文件去生成makefile。CMake通过CMakeLists.txt 文件来描述项目的构建过程,用户可以在这个文件中定义源代码、库、头文件、编译选项等信息,从而让CMake自动生成相应的构建文件。

https://i-blog.csdnimg.cn/blog_migrate/c9245cf4c2f0baac835c63ec1fa7e4b2.png

main函数是什么?

编程语言像C/C++/C#/JAVA 等main主函数作为程序入口,程序从main()主函数的第一句代码开始执行,直到main函数的最后一句代码程序运行结束,结束后程序退出,申请的所有内存空间等被回收。

c++为什么分为头文件和cpp文件

C++ 支持将接口(声明)和实现(定义)分开。头文件通常包含函数、类、模板等的声明,而源文件包含它们的具体实现。

提高编译效率:头文件通常只包含声明,它们可以在多个源文件中被包含而不需要重新编译,允许开发者在不同的源文件中重用相同的接口。

利于接口隐藏:头文件可以作为模块的接口,而源文件包含实现细节。这有助于隐藏实现细节,只暴露必要的接口给其他模块

动态库

C++内存管理:理解堆、栈、指针,避免内存泄漏

堆是一块用于动态分配内存的区域,存放的是通过new和delete关键字来分配和释放的对象。堆上的内存需手动管理,如果不及时释放,就会造成内存泄漏。

栈是一种自动分配和释放的内存区域。在函数调用时,局部变量和函数参数会在栈上分配内存,当函数结束时,栈上的内存自动释放。一般函数在栈上。

通过指针,我们可以访问堆上分配的内存。

在 C++ 中,你可以使用 new 操作符来在堆上动态申请内存。下面是一个示例,展示如何申请一个 int 类型的指针 p 并将其存放在堆上:

int* p = new int; // 在堆上申请一个 int 类型的内存空间,并将其地址赋给指针 p

这个代码完成了两件事: 

  • 使用 new 关键字在堆上分配了足够的内存空间来存储一个 int 类型的值。
  • 将分配到的内存地址赋给指针 p。

 注意,当你使用 new 在堆上分配内存时,你需要负责后续的内存管理。这意味着,当你不再需要这块内存时,你应该使用 delete 操作符来释放它,以避免内存泄漏(程序持续运行,不释放的内存会逐渐累积,最终可能导致程序或整个系统可用内存不足。):

delete p; // 释放之前分配给 p 的内存

如果你申请了一个数组,应该使用 delete[] 来释放内存:

int* pArray = new int[10]; // 在堆上申请一个 int 类型数组的内存空间
// ...
delete[] pArray; // 释放数组占用的内存

想象你在一个图书馆里借了一本书,new int 就像是你向图书馆管理员请求一个空书架,管理员会给你一个编号,告诉你这个书架现在归你使用。这个编号,就是我们的指针 p。你有了一个地方来存放你的书,也就是你的 int 类型的数据。new 这个操作,就像是你告诉管理员:“我要一个新书架,不要旧的。”当你读完书后,你决定将书归还给图书馆,让他们可以回收这个空间,给其他需要的人使用。这相当于在编程中使用 delete p; 来释放指针 p 指向的内存。

如果你归还了书,却没有让图书馆工作人员知道这个书架现在空了(p 在释放内存后未设置为 nullptr),会发生什么呢?

再次使用这个编号去查找书,你可能会空手而归。(指针指向的内存已经被释放,但指针仍然指向那个位置,导致无法访问有效的数据)

错误地认为书架上还有书(数据),尝试再次申请借阅(尝试访问已经被释放的内存,可能会导致程序错误或崩溃)

其他读者可能会用这个编号去错误地取书(数据),或者尝试在那个书架(空间)上放置自己的书(安全漏洞,可能导致数据覆盖或未授权的访问)

C++内存管理:理解堆、栈、指针,避免内存泄漏-腾讯云开发者社区-腾讯云 (tencent.com)

动态库与静态库区别

用一个比喻来描述动态库和静态库的区别:

动态库
想象一辆公共汽车,任何人都可以在任何时间上车(加载库),并在需要的时候下车(卸载库)。车上的座位(内存)是共享的,不同的乘客(程序)可以使用相同的座位,但不需要拥有它。如果公共汽车需要维修或升级,只需更换车辆,所有乘客都能享受到改进,无需额外费用。

静态库
想象一辆私家车,当你购买它时,它包含了所有你需要的部件(代码)。每次出行(运行程序),你只能使用这辆车和它的部件。如果你想更换部件或升级,你需要自己掏钱购买新的部件并安装。每次出行,无论是否需要,你都必须携带所有部件,即使有些部件在某些行程中并未使用。
 

如何把一个函数导出一个动态库

见c++相关函数和类的dll导入及导出(VScode)-优快云博客

面向对象的多态性

多态:当不同的对象去完成某一个行为时会产生出不同的状态。 “一个接口,多种方法”

或者说,不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

函数继承中构成多态的条件:

  • 通过基类的指针或者引用调用虚函数。
  • 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(覆盖)

【C++】多态(举例+详解,超级详细)_c++多态-优快云博客

虚函数

虚函数是实现多态(动态绑定)/接口函数的基础

可以定义一个基类的指针, 其指向一个继承类, 当通过基类的指针去调用函数时, 可以在运行时决定该调用基类的函数还是继承类的函数

C++面试题之虚函数(表)实现机制_虚函数表是怎么实现的-优快云博客

接口继承

 以【C++】多态(举例+详解,超级详细)_c++多态-优快云博客其中一个代码为例:

函数利用父对象指针来访问子对象,然后根据子对象的函数来调用。虚函数的重写是接口继承,实现重写

两个类 A 和 B,其中 B 继承自 A。基类 A 中有虚函数 func 和 虚函数test(test调用了func),而派生类 B 重写了 func 函数。注意, B 中的 func 函数重写了类A 中的 func,它们具有不同的默认参数值。(这里重写的定义我查了,默认参数不同不构成重载)主函数中创建了 B 类的一个实例,并通过基类指针 p 调用了 test。 

由于 test 函数在 A 中定义,调用的是 A 中的 test 函数,,test 函数内部调用的是 func 函数。而p 实际上指向 B 类的对象,又由于 func 是虚函数,重写使得在运行 p->test() 时,实际调用的是 B 中的 func 函数的B->

但由于默认参数在编译时确定(而非运行时),因此使用的是 A 中定义的默认参数 1。

补充:默认参数的行为

在C++中,默认参数是在编译时解析的。当通过基类指针或引用调用虚函数时,默认参数值是根据基类中的定义来确定的,而不是根据实际调用的派生类中的。

代码运行结果是B->1。 

STL标准模板库——数据类型的多态

在C++中,标准模板库(STL)通过模板机制体现了在数据类型上的多态性。STL中的容器、算法和迭代器都是通过模板来实现的,这使得它们可以处理不同类型的数据,不需要为每种数据类型单独实现一套代码。

模板机制

C++的模板机制是实现多态性的基础。模板允许你定义一个通用的类或函数,而不需要指定具体的类型。模板参数可以在实例化时被具体的类型替换。

模板类

模板类允许你定义一个通用的类,其中的某些成员可以是任意类型。例如,std::vector是一个模板类,可以存储任意类型的元素。

template <typename T>
class vector {
    // 类的实现
};

使用时可指定具体类型:

std::vector<int> intVector; // 存储int类型的元素
std::vector<std::string> stringVector; // 存储std::string类型的元素
模板函数

模板函数允许你定义一个通用的函数,其中的某些参数可以是任意类型。例如,std::sort是一个模板函数,可以对任意类型的容器进行排序。

template <typename RandomIt>
void sort(RandomIt first, RandomIt last) {
    // 函数的实现
}

容器

STL中的容器类(如vector、list、map等)都是模板类。例如,std::vector<T>可以存储任意类型的元素T,无论是基本数据类型(如int、double)还是用户定义的类型(如自定义的类)。

std::vector<int> intVector = {1, 2, 3, 4, 5};
std::list<double> doubleList = {1.1, 2.2, 3.3};
std::map<std::string, int> stringToIntMap = {{"one", 1}, {"two", 2}};

算法

STL中的算法(如std::sort、std::find、std::transform等)也是通过模板实现的。这些算法可以应用于不同类型的容器和迭代器。

std::vector<int> numbers = {3, 1, 4, 1, 5, 9};
std::sort(numbers.begin(), numbers.end()); // 对int类型的vector进行排序

std::vector<std::string> words = {"apple", "orange", "banana"};
std::sort(words.begin(), words.end()); // 对std::string类型的vector进行排序

迭代器

迭代器是STL中连接容器和算法的桥梁。迭代器也是模板化的,可以指向不同类型的容器和元素。 

std::vector<int>::iterator it = numbers.begin(); // 指向int类型vector的迭代器
std::vector<std::string>::iterator wordIt = words.begin(); // 指向std::string类型vector的迭代器

 

nanobind:现代C++/Python绑定的高效编译与性能优化实践 在混合编程领域,C++与Python的绑定技术是实现高性能计算与灵活生态结合的关键。其核心原理在于通过特定的接口层,实现两种语言间数据类型与函数调用的无缝转换,从而让开发者能够利用C++的执行效率来加速Python应用。这项技术的价值在于极大地扩展了Python在科学计算、机器学习和系统级开发中的应用边界。在实际应用中,开发者常面临编译速度慢、二进制文件体积大等工程痛点。针对这些挑战,nanobind作为一个为现代C++(C++17/20)和Python 3优化的绑定工具应运而生。它通过精简的类型系统和高效 阅读详情

相关推荐

make 是一个构建自动化工具,通常与 Makefile 文件一起使用,来管理和自动化 C++ 代码的编译过程。

使用make和Makefile可以有效地管理和自动化 C++ 项目的构建过程。它允许开发者定义复杂的构建规则和依赖关系,而且可以通过简单的命令来执行构建和清理操作。这种方式特别适合大型项目,其中文件数量众多,依赖关系复杂。让我们通过一个实际的例子来说明make的用法。假设我们有一个简单的 C++ 项目,它包含一个主文件 (main.cpp) 和一个辅助函数文件 (和我们将编写一个Makefile来自动化编译过程。这个例子展示了如何使用make和Makefile来自动化 C++ 代码的编译过程。

小秋 AI SLAM 入门实战教程 1607

【C++】Cmake使用教程(看这一篇就够了)

以上是自己学习CMake的一点学习记录,通过简单的例子让大家入门CMake,学习的同时也阅读了很多网友的博客。CMake的知识点还有很多,具体详情可以在网上搜索。总之,CMake可以让我们不用去编写复杂的Makefile,并且跨平台,是个非常强大并值得一学的工具。

Friday 15万+

【C++动态库编程】C++名称改编、标准C接口、extern “C“、函数调用约定以及def文件详解

本文通过一个具体的dll动态库编程实例,详细讲述动态库导出接口相关的导入导出声明、标准C接口、extern "C"作用、函数调用约定声明、跨语言调用dll接口以及def文件等内容。

dvlinker的技术专栏 3万+

C++编译之(2)-make及makefile编译过程

make及makefile编译

youlinhuanyan的博客 4046

保姆级教程:用Protege 5.5.0从零构建你的第一个知识图谱(附实战案例文件)

本文提供了一份详细的Protege 5.5.0使用指南,从零开始构建知识图谱。涵盖环境配置、本体结构设计、实例填充到可视化展示的全流程,特别适合初学者快速掌握知识建模技术。通过实战案例演示,帮助读者理解如何定义类、属性及建立实例关系,是学习知识图谱构建的实用教程。

weixin_42548816的博客 554

使用python读取卫星测高数据并做相应的处理

5.在python处理结果如下,最大的优点就是比matlab快30-40倍。4.进行粗差的如NaN值,还有进行3倍方差进行对粗差处理。1.首先遍历卫星数据的文件,挨个读取每个数据。有问题,请各位读者及时告知,一起完善内容。3.进行下一步,筛选在研究区域的数据。4.进行按天求平均和按月求平均。2.读取数据主体代码。

爱下去更难! 1133

现代C++项目构建实战:CMake、动态库与多态性应用指南

在C++开发中,构建系统和代码组织是项目工程化的基础。CMake作为跨平台构建的事实标准,通过声明式配置管理项目依赖和编译过程,解决了不同平台和编译器的兼容性问题。动态链接库(DLL/SO)技术实现了代码的模块化与复用,通过运行时加载机制,支持热更新和插件化架构,是软件分发和部署的核心。面向对象编程中的多态性,通过虚函数和继承机制,实现了“一个接口,多种实现”的灵活设计,是框架和设计模式的基础。本文以CMake构建工具为核心,结合动态库创建和多态性设计,通过一个完整的动物类族示例项目,演示如何搭建结构清晰、

weixin_30843121的博客 252

用C++手把手教你连接SimNow期货模拟盘:从CTP API封装到第一个订单(附完整代码)

本文详细介绍了如何使用C++连接SimNow期货模拟盘,从CTP API的基础架构解析到实现第一个订单的完整流程。内容涵盖CTP API的封装、SimNow环境配置、交易通道实现、行情接收与处理等核心环节,并提供完整代码示例,帮助开发者快速掌握量化交易中的期货模拟盘连接技术。

weixin_27215337的博客 328

模块化与多态性:构建灵活可扩展软件架构的核心实践

在软件工程中,模块化与多态性是构建可维护、可扩展系统的两大基石。模块化通过关注点分离和高内聚低耦合的原则,将复杂系统分解为独立的、功能内聚的单元,如动态链接库或命名空间,从而提升代码的组织性和复用性。多态性则允许通过统一的接口操作不同类型的对象,具体行为在运行时动态决定,这极大地增强了代码的灵活性和可维护性。其技术价值在于实现了“对扩展开放,对修改关闭”的开闭原则,使得系统能够在不修改核心架构的前提下,轻松应对需求变化。这一设计思想在图形绘制系统、插件架构、算法框架等场景中应用广泛。例如,在图形计算系统中,

weixin_33882452的博客 365

ENVI 5.6 + Sarscape 5.2 保姆级教程:哨兵一号数据处理全流程(含DEM自动下载)

本文提供ENVI 5.6与Sarscape 5.2处理哨兵一号数据的完整实战教程。详细介绍了从数据导入、研究区裁剪、DEM自动下载与集成,到核心的配准、滤波及地理编码全流程,最终生成可用于定量分析的地理编码后向散射系数图。重点演示了DEM数据在SAR处理中的关键作用与自动获取方法,帮助用户快速掌握SAR数据基础处理技能。

coffee的博客 679

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 878

C++学习路线图:从核心语法到现代工程实践的系统指南

在系统级编程和高性能计算领域,对内存和资源的精细控制是核心诉求。C++作为一门支持面向对象、泛型和过程式编程的静态类型语言,其核心原理在于通过编译器进行严格的类型检查,并允许开发者直接操作硬件资源,从而实现对性能的极致追求。这种底层控制能力赋予了C++极高的技术价值,使其成为构建操作系统、游戏引擎、数据库和高频交易系统等关键基础设施的基石。在现代软件开发中,随着对并发、资源安全和代码可维护性要求的提升,现代C++标准(C++11/14/17/20)引入了智能指针、移动语义和Lambda表达式等特性,极大地提

337

LVGL项目内存告急?试试把中文字库放到SD卡里(基于LvglFontTool V0.5)

本文详细介绍了在LVGL嵌入式项目中如何通过将中文字库存储到SD卡来优化内存使用。针对Flash资源有限的MCU,如STM32F103,提供了基于LvglFontTool V0.5的外部字库生成与动态加载方案,适用于多字号、多语言及OTA场景,显著减少固件体积并提升显示灵活性。

weixin_33726318的博客 456

C++模板与C混合编程:解决链接错误的四种策略与实践

在C++与C混合编程中,链接错误是开发者常遇到的挑战,其核心源于两种语言编译模型的差异。C++模板采用延迟实例化机制,编译器在模板被使用时才生成具体类型的代码,而C语言遵循一次编译、按名链接的简单模型。这种差异在混合链接时,常导致‘undefined reference’错误,影响项目构建与跨语言协作。为解决此问题,开发者需掌握从编译原理到工程实践的关键技术。本文深入探讨了四种主流解决方案:头文件完全定义法、显式实例化法、C接口封装法以及类型擦除模式,并结合实际场景分析其优劣。例如,在需要提供稳定二进制接口

weixin_33805992的博客 285

18006.STM32通过SPI读取LAN9253数据

【代码】18006.STM32通过SPI读取LAN9253数据。

写给自己的笔记 555

S7-1200PLC V90伺服绝对值编码器校准功能块

S7-1200PLC通过111报文和EPOS模式实现位置轴轴控功能(FB284封装)-优快云博客文章浏览阅读173次。EASY_SINA_POS的详细使用介绍请参考下面文章链接:S7-1200PLC使用标准报文111和EPOS模式实现V90 PN总线伺服定位(Easy_SINA_Pos)_西门子sinapos-优快云博客文章浏览阅读132次。文章浏览阅读7k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。

RXXW_Dor的博客 968

SWIG高级特性详解:模板、继承、多态等复杂场景处理

SWIG是一个强大的软件开发工具,能够将C/C++程序与多种高级编程语言连接起来。在复杂场景下,SWIG的高级特性处理能力尤为关键,特别是对模板、继承、多态等现代C++特性的支持。本文将深入解析SWIG如何优雅处理这些复杂编程场景。 ## 🚀 SWIG模板处理机制 SWIG在处理C++模板时展现了出色的灵活性。通过类型映射和模板特化,SWIG能够为不同的目标语言生成相应的绑定代码。模板实例化

gitblog_00104的博客 958

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++静态库与动态库

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。

qq_54178958的博客 1096

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++静态库与动态库理解、创建、使用(超详细版本)

打开工程“属性面板”è”配置属性”è “C/C++”è” 常规”,在“附加包含目录”属性值中,键入DynamicMath.h 头文件所在目录的路径或浏览至该目录。打开工程“属性面板”è”配置属性”è “C/C++”è” 常规”,在“附加包含目录”属性值中,键入StaticMath.h 头文件所在目录的路径或浏览至该目录。l -l:指定链接时需要的动态库,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a或.so来确定库的名称。l -l:指定链接时需要的动态库。

广西彭于晏的博客 3262

3.C++ Make

一个工程中有很多文件,文件之间都是相辅相成有着编译的先后顺序,但是如果自己手动根据编译顺序编译文件造成速度非常慢。Makefile 是”自动化编译“,只需一个 make 指令系统就会根据编译顺序帮自己编译文件。

许挂挂的博客 1238

C++(GCC)生成和使用动态库

使用动态库的好处有以下几点: 1. 节省内存空间:动态库在程序运行时才会被加载,不会像静态库那样在编译时就被全部链接进可执行文件中,因此可以节省内存空间。 2. 便于更新:当动态库更新时,只需要替换动态库文件即可,不需要重新编译整个程序。 3. 提高程序运行效率:由于动态库可以被多个程序共享,因此可以减少内存中的重复代码,提高程序运行效率。 4. 方便程序的开发和维护:动态库可以被多个程序共享,因此可以减少代码冗余,提高代码复用率,方便程序的开发和维护。 5. 支持动态加载。

mahuifa的博客 4907

C++——cmake,make,gcc

gcc,cmake,make的关系

宁子的博客 1577

C++动态链接库的创建及使用

运行时加载:程序运行时动态加载,节省内存。独立更新:更新库无需重新编译主程序。可重用性:由于多个应用程序可以共享一个DLL,因此它们可以共享相同的代码和数据,从而提高了代码的可重用性。节省内存:由于DLL在运行时才加载到内存中,因此它们可以在不占用过多内存的情况下提供所需的功能。稳定性:由于多个应用程序共享相同的DLL,因此如果DLL中的代码或数据发生问题,则可以在一次更新后修复所有使用该DLL的应用程序。

保持分享欲 3214

C++学习(三)CMake基础

来源于网络,供自己参考学习,如有问题,欢迎指正! 文章目录一、基础概念1、Makefile2、make工具3、CMake3.1、why?3.2、简介二、CMake应用学习1、Window下安装及使用(1)CMake安装(2)CMake命令行运行示例(3)CMake-GUI运行示例2、Linux下安装及使用 一、基础概念   我们以gcc编译器为例来说,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等),当你的程序只有一个源文件时,直接就可以用gcc命令编译它。.

gaobin的博客 1606

cmake使用教程(实操版)(一)

cmake使用教程 本文主要借鉴《CMake+Pratice》一文,如果造成版权问题请联系作者删除。作者在网络上发现关于cmake的中英文材料都比较少,所以有了整理cmake的入门教程的想法。如果需要深入了解cmake的各种命令,建议在已有的项目中学习。在介绍本文的cmake内容之前,本文将整个使用教程分成七篇文章。 一、初识cmake 官网:www.cmake.org 优点: 1、开源代码,使用类BSD许可发布。 2、跨平台,并可以生成native编译配置文件,在linux/Unix平台,生成makefi

qq_34796146的博客 1万+

动态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运行时加载)

静态链接库在链接时,编译器会将 .obj 文件和 .LIB 文件组织成一个 .exe 文件,程序运行时,将全部数据加载到内存。 如果程序体积较大,功能较为复杂,那么加载到内存中的时间就会比较长,最直接的一个例子就是双击打开一个软件,要很久才能看到界面。这是静态链接库的一个弊端。 动态链接库有两种加载方式:隐式加载和显示加载。 隐式加载又叫载入时加载,指在主程序载入内存时搜索DLL,并将DLL载...

u013407012的专栏 3808
上一篇: 【pytorch】学习+手写数据集训练详解
LCQDAYTOY
博客等级 码龄3年 151粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值