静态连接(dynamic link)和动态连接(static link)初步理解

C++静态链接与动态链接:原理、实战与选择指南 在软件构建过程中,链接是将多个编译单元组合成可执行程序的关键步骤。其核心原理在于解析符号引用,将分散的代码和数据整合为统一的地址空间。从技术价值看,链接方式直接影响程序的部署、运行效率和维护性。静态链接在编译时将库代码复制到可执行文件中,生成独立但体积较大的程序;动态链接则在运行时加载共享库,节省资源但依赖环境。这两种机制在工程实践中各有应用场景:静态链接适用于分发独立工具、嵌入式环境或需要固化依赖版本的场景;动态链接则广泛用于大型桌面应用、系统服务及支持插件架构的软件。理解静态链接与动态链接的差异,能帮助 阅读详情

前两天配置QT和VTK环境,焦头烂额啊,第一次配置个环境配置这么费劲的,这俩工具都不是微软出的开发库,需要自己编译,编译时间那个长。。。3,4个小时啊,等的花都谢了,好不容易编译好了,又出现了各种问题。

首先,早就听说过这两个库是跨平台的,当时觉得好牛逼啊,作为一个鄙视windows的linuxer,当然是要用跨平台的东西了,然后下载,安装,编译,经过了一晚上的折腾,QT编译好了,随便写了段TEST代码,编译,通过,运行,失败,问题是,失败就失败呗,居然提示未找到一个什么QT的动态链接库,网上搜了下,发现QT默认编译是dynamic的,当时那个悔,这不坑爹么,没办法,再编译一次,选成static,又是一夜,最后看一下,终于不提示了。

试着在虚拟机XP上运行一下,你不是跨平台厉害么,WINDOWS不同版本总能搞定吧?结果又提示错误,一看,是msvctrd.dll错误,我靠,立刻明白了,是MD和MT设置问题,赶明QT的STATIC参数设置只是内部库的静态连接,不包括QT和windows的连接啊!彻底被坑死,于是决定今晚再编译一晚上,应该没问题了。。。

 

 

好了,辈催的经历过后总要反思一些东西,那就说说静态连接和动态连接的理解吧。

 

说起静态连接和动态连接,就不得不说一下静态链接库和动态链接库。静态链接库在wiki里是这么定义的:statically-linked library is a set of routines, external functions and variables which are resolved in a caller atcompile-time and copied into a target application by a compiler, linker, or binder, producing an object file and a stand-alone executable。这段文字不难理解,意思就是静态链接库是一系列函数、变量,在编译、连接过程中,生成的一个目标文件。而动态链接库的概念则是:Dynamic-link library (also written without the hyphen), orDLL, is Microsoft's implementation of the shared library concept in the Microsoft Windows and OS/2 operating systems. 从这个概念基本看不出什么东西,只知道他是微软特有的库,并且是个分享库(shared library)。那么,动态连接和静态连接到底什么区别?其实就在于载入库的时间问题。在静态连接里,库会在compile-time被载入,而在静态连接里,库会在run-time载入。这个差异会造成一个有趣的现象,也就是程序的可移植性问题,打个比方,我写了段程序,用了动态连接,由于我机器上环境配置完整,因此不存在库缺失的问题,因此无论是编译还是运行,都没错,但是换台机器,突然用不了了,原因就是这台机器环境没配置好,程序动态寻找local library,结果失败,因此出错,而用静态连接则无此类问题,在编译阶段,编译器会把用到的所有函数、变量等,连接到一个文件里,程序移植后,由于不依赖本地函数库,因此可以正常运行。

 

有了以上知识,就不难理解Visual Studio里面的MT和MD的区别了,根据微软MSDN上的定义,MD的定义是:Causes your application to use the multithread- and DLL-specific version of the run-time library. Defines_MT and _DLL and causes the compiler to place the library name MSVCRT.lib into the .obj file. 这句话的重点在“DLL-spedific version of the run-time library”,也就是,用的是动态连接,而MT的定义是:Causes your application to use the multithread, static version of the run-time library. Defines _MT and causes the compiler to place the library name LIBCMT.lib into the .obj file so that the linker will use LIBCMT.lib to resolve external symbols. 重点在那个“static version of the run-time library”,也就是静态连接。

 

至此,问题完全解决。还有一点值得思考的是,微软自带的运行环境里看样子也是有静态库和动态库两套,那么在API开发领域,是不是每个库的开发都需要静态和动态两个版本呢?

 

 

程序链接与装入:静态、动态、运行时链接与三种装入方式详解 在计算机系统中,链接与装入是程序从源代码到内存中运行的关键环节。链接负责将多个编译后的目标文件组合成可执行文件或库,解决模块间的符号引用问题;装入则负责将可执行文件加载到内存并准备执行。从原理上看,链接方式主要分为静态链接、动态链接和运行时链接,它们直接影响程序的体积、部署和性能。静态链接将所有依赖库代码打包进可执行文件,部署简单但体积大;动态链接则让多个程序共享系统库,节省资源但依赖管理复杂;运行时链接通过dlopen等接口实现插件化加载,灵活性高。装入方式则包括绝对装入、静态重定位装入和动态运行时装入, 阅读详情

相关推荐

C/C++库开发全解析:从静态/动态库原理到CMake实战

在C/C++开发中,库是封装了可复用代码的集合,其核心价值在于提升开发效率和代码质量。从原理上看,库主要分为静态库和动态库:静态库在编译链接时将代码直接复制到可执行文件中,实现独立部署;动态库则在运行时加载,实现代码共享和灵活更新。在工程实践中,HAL库和工具库是两类典型应用,前者为硬件操作提供统一接口,后者则封装通用功能以加速开发。通过CMake等现代构建工具,开发者可以高效管理库的编译、链接和依赖,从而构建模块化、可维护的大型项目。本文以HAL库和工具库为例,深入探讨了库的设计、实现与集成,为C/C++

weixin_30876945的博客 402

动态链接(dynamic link)与静态链接(static link)

静态库与动态库       静态库的所有数据都会被整合进目标代码中,因此编译成的文件比较大。它的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为缺点,(1)首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。(2)再者,一旦发现了静态函

lx123010的专栏 5056

C++静态库与动态库:原理、创建、使用与工程实践指南

在软件工程中,库是代码复用和模块化设计的核心概念,它将通用功能封装为可复用的二进制组件。从原理上看,库分为静态库和动态库两种主要形式,其根本差异在于链接时机和代码合并方式。静态库在编译链接期将代码直接复制到最终可执行文件中,生成独立、自包含的程序,但会导致磁盘空间浪费和更新困难;动态库则在运行时被加载和映射到进程内存空间,支持多进程共享同一份代码,显著节省内存并便于模块化更新,但带来了依赖管理和版本兼容性等挑战。这两种技术方案在性能、部署、维护等方面各有优劣,其选择直接影响程序的体积、启动速度、内存占用和部

weixin_34319374的博客 349

linux动态库文件,linux 动态库文件stripped属性理解

在centos6.2下用file命令查看文件信息的时候,显示如下:libcom_err.so.2:ELF64-bitLSBsharedobject,x86-64,version1(SYSV),dynamicallylinked,strippedlibcrypto.so.10:ELF64-bitLSBsharedobject,x86-64,...

weixin_33668386的博客 902

VTK源码编译安装记录与教程(VS2019+QT5.15.2+PCL1.12.1+VTK9.1.0配置,超详细)

因为PCL库(傻瓜式安装)中自动安装的VTK库并不完整,不支持QT环境的UI界面开发,于是,想用QT在VS2019上开发图形界面程序,需要单独自己通过VTK源码编译安装,再进行配置。本人安装时开发环境已经装好的是VS2019+QT5.15.2+PCL1.12.1,供参考,其他版本基本上大同小异,需要注意的是在自动安装的PCL库中,看到里面VTK库的版本是9.1.0,于是,在源码编译安装VTK过程中,为了保险也用的是9.1.0版本。

大龙虾的技术成长专栏 1万+

VTK 编译好的头文件和静态链接库 Visual studio可用

VTK 编译好的头文件和静态链接库 Visual studio可用 为不想下载CMAKE编译的朋友节省时间 VTK 5.8版本

13 Link(链接)

链接器在处理多个目标文件时可能遇到重复符号定义问题。为了解决这个问题,链接器依赖于符号的分类:强符号(Strong Symbols)和弱符号(Weak Symbols)。强符号与强符号:如果链接器发现两个或多个目标文件中具有相同名称的强符号(例如,已分配存储空间的变量或已定义的函数),那么它将报告一个链接错误,指明存在多重定义。在这种情况下,开发者需要检查源代码以找出重复定义并进行修正。

m0_56898461的博客 770

量化回测框架三选一:Backtrader、Zipline、PyAlgoTrade,新手到底该跟谁学?

本文对比分析了三大量化回测框架Backtrader、Zipline和PyAlgoTrade,帮助新手选择最适合的入门工具。从安装配置、策略编写到文档查阅,详细解析各框架的特点和适用场景,为量化交易初学者提供实用指南。

weixin_28745309的博客 268

数据结构学习笔记——静态链表

古老的链表——静态链表 定义:用数组描述的链表叫做静态链表 下面是静态链表的定义及一些基本操作: 1.定义节点 #define MAXSIZE 1000 typedef struct { ElemType data; int cur; }Component,StaticLinkList[MAXSIZE]; 解析: ①静态链表也有数据域和指针域,但这里的指针并不是真正的指针,而是用cur来代替...

qq_43771635的博客 534

迈德威视相机调用( 基于 Linux系统+ OpenCV )

迈德威视相机调用( 基于 Linux系统+ OpenCV )前言一、登录迈德威视官网,下载官方SDK二、代码调用与视频帧处理( 基于 OpenCV )总结 前言     此博客记录了迈德威视工业相机在 Linux 系统下的代码调用及其环境配置,通过 OpenCV 对视频帧进行处理。   一、登录迈德威视官网,下载官方SDK      迈德威视官网 : http://www.mindvision.com.cn/     1. 进入官网后,在服务支持中选择软件下载。    2. 选择Linux系统S.

kkkkkk0729的博客 5679

R爬虫RSelenium环境搭建及简单应用

这是鄙人自己实践的一种可行的环境搭建,我会尽量详细的写下大家步骤。

weixin_44349986的博客 2013

(转)静态编译,动态编译,静态链接库,动态链接库

1.定义 LIB文件中包含函数代码本身,在编译时直接将代码加入程序当中。称为静态链接库static link library。 LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 静态链接库包括两个文件: (1).h头文件,包含静态链接库中说明输出的类或符号原型或数据结构...

qq_38350514的博客 454

r语言svr模型_R语言初探强化学习中的马尔可夫模型

强化学习大家这几年应该不陌生,从AlphaGo到AlphaZero让大家见识到了强化学习的力量。我们今天给大家介绍一个在强化学习中核心思维马尔可夫决策过程(MDP)。马尔科夫决策过程是基于马尔科夫论的随机动态系统的最优决策过程。它是马尔科夫过程与确定性的动态规划相结合的产物,故又称马尔科夫型随机动态规划,属于运筹学中数学规划的一个分支。今天我们给大家介绍下马尔可夫决策过程中用到一些算法以...

weixin_28994357的博客 1111

ALSA 专业术语 和 dai_link 分析

原因:dai_link 回答的问题是"

mapleay的博客 415

Realtek 10GbE芯片组解析:低成本高速网络方案

10GbE(万兆以太网)技术通过提升网络带宽,显著改善了数据传输效率,成为现代网络架构的核心组件。其工作原理基于高速串行通信协议,通过优化信号处理和编码技术实现低延迟、高吞吐量。在技术价值上,10GbE不仅满足数据中心和企业网络的高需求,还逐步渗透到消费级市场,推动家庭和小型企业的网络升级。应用场景包括NAS存储、视频编辑工作站和云服务接入等。Realtek最新发布的RTL8127、RTL8159和RTL8261C芯片组,以低功耗和低成本优势,进一步降低了10GbE的普及门槛。这些芯片支持PCIe Gen4

weixin_36427956的博客 587

Claude Code 任务编排 头脑风暴与 疯狂拷问:Superpowers vs Grill-me 硬核对比与工程落地

Superpowers和Grill-me是AI编程中的互补工具:Superpowers提供工程化开发流程(从需求梳理到代码审查),确保规范执行;Grill-me通过持续追问帮助厘清需求,避免方向偏差。两者结合形成"构思-拷问-执行"工作流,前者负责方案生成与落地,后者专注需求审查。根据场景选择:个人项目可用Grill-me快速澄清需求,企业项目推荐Superpowers全流程,复杂开发则建议组合使用。它们分别解决"如何落地"和"是否对齐"的问题,共

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 325

静态编译,动态编译,静态链接库,动态链接库

1.定义  LIB文件中包含函数代码本身,在编译时直接将代码加入程序当中。称为静态链接库static link library。  LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。  静态链接库包括两个文件:  (1).h头文件,包含静态链接库中说明输出的类或符号原型或数据结构

疯子小鱼 1295

【红绿灯识别】基于计算机视觉实现道路信号灯检测识别系统附Matlab代码

随着自动驾驶技术的快速发展,对道路交通信号灯的检测识别技术也提出了更高的要求。本文提出了一种基于计算机视觉的道路信号灯检测识别系统,该系统能够准确地检测和识别道路交通信号灯,并输出信号灯的颜色信息。该系统采用深度学习方法,利用卷积神经网络(CNN)对道路交通信号灯进行检测和识别。实验结果表明,该系统能够在复杂的环境中准确地检测和识别道路交通信号灯,具有较高的实用价值。道路交通信号灯是道路交通管理的重要组成部分,它能够有效地组织交通,提高道路通行效率,保障交通安全。

qq_59747472的博客 339

linux程序同时链接动态库与静态库

在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定为连接静态库则使用: gcc test.cpp -L. -static -ltes

qinjinghua2012的专栏 672

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Gatsby Link 原理与实战:构建时预加载机制深度解析

静态站点生成器(SSG)通过构建时静态分析实现性能跃迁,其核心在于将运行时路由跳转前置为编译期资源调度。Gatsby Link 正是这一范式的具象化体现——它并非普通 React 组件,而是触发页面依赖图生成、page-data.json 预取及 JavaScript chunk 智能加载的构建期指令。该机制显著提升首屏内容绘制(FCP)与可交互时间(TTI),尤其适用于内容稳定、页面量级适中的中大型网站。结合 React 生态与静态优化,Link 在保障降级可用性(a11y/SEO)的同时,支撑起毫秒级导

weixin_34318272的博客 466

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux地址重定位:静态与动态链接技术详解

地址重定位是程序加载和执行的核心机制,解决虚拟地址到物理地址的映射问题。在Linux系统中,这一过程通过静态重定位和动态重定位两种方式实现。静态重定位在程序加载时一次性完成地址修正,具有执行效率高的特点,但缺乏灵活性;动态重定位则通过位置无关代码(PIC)和全局偏移表(GOT)实现运行时地址解析,支持代码共享和地址空间布局随机化(ASLR)。理解ELF文件格式和动态链接器(ld.so)的工作原理,对于优化程序内存使用、提升系统安全性至关重要。本文深入解析这两种重定位技术的实现原理、性能差异及在Linux系统

weixin_30267785的博客 370

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux中《动/静态库原理》

本文深入解析了ELF(Executable and Linkable Format)文件格式在编译链接过程中的关键作用。从目标文件(.o)生成、多文件合并到可执行文件加载,详细阐述了ELF文件的四种类型(可重定位、可执行、共享目标、核心转储)及其四部分结构(ELF头、程序头表、节头表、节)。重点介绍了readelf工具的使用方法,并通过实例展示了可执行程序加载时Section合并为Segment的过程,揭示了程序从编译到运行的底层实现机制。

zxybf_的博客 880

CLion实战:C语言静态库与动态库的创建、编译与链接全流程

在软件工程中,模块化是一种核心设计思想,旨在将复杂系统拆分为高内聚、低耦合的功能单元,以提升代码的可维护性和复用性。其具体实现技术之一便是库(Library),它通过预编译的二进制代码封装特定功能。从原理上讲,库分为静态库和动态库:静态库在编译链接期将其代码直接复制到最终可执行文件中,实现独立部署;动态库则在程序运行时被加载和链接,支持代码的跨进程共享与热更新。这项技术的核心价值在于显著提升开发效率、优化资源利用并简化大型项目管理。其应用场景广泛,从构建独立发布的命令行工具到开发支持插件扩展的复杂桌面应用,

weixin_34112181的博客 414

C/C++静态库与动态库编译实战:从原理到工程实践

在C/C++开发中,库是代码复用和模块化设计的核心机制,理解其编译与链接原理是工程师进阶的必备技能。静态库和动态库的本质区别在于链接时机与内存管理方式:静态库在编译时将代码直接拷贝到可执行文件中,而动态库则在运行时由操作系统加载并映射到进程地址空间,实现多进程间的代码共享。掌握符号可见性控制与位置无关代码(PIC)等关键技术,能有效提升库的安全性、减小体积并确保跨平台兼容性。这些技术对于封装核心算法模块、集成第三方依赖以及优化大型项目构建流程具有重要价值。本文以实战为导向,系统解析了从源码编译到部署的完整路

weixin_34088583的博客 439

程序链接与装入机制详解:静态链接、动态链接与内存装入原理

在计算机系统中,链接与装入是程序从源代码到可执行运行的关键环节。链接负责将多个目标文件与库文件合并,解决符号引用,生成可执行文件或共享库;其核心原理包括符号解析、地址分配与重定位。装入则负责将可执行文件加载到内存,并建立进程的虚拟地址空间,涉及绝对装入、可重定位装入和动态运行时装入等策略。从技术价值看,链接与装入机制直接影响程序的性能、内存占用、部署复杂度及更新灵活性。例如,静态链接通过一次性打包所有依赖,实现快速启动与独立部署,但会导致体积膨胀;动态链接则通过共享库节省内存,支持热更新,但引入了依赖管理的

weixin_30399155的博客 409
上一篇: [翻译]为Windows安装QT
下一篇: qt中signal碎碎念
对象
博客等级 码龄17年 70粉丝 53原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值