静态链接库、动态链接库和动态加载库

C语言静态链接库和动态链接库讲解及制作使用 C语言静态链接库和动态链接库讲解及制作使用 1. 引言 静态链接库和动态库均为函数库 函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用 就像scanf和printf函数一样,通过#include <stdio.h>,即可调用 早期并没有函数库,只是后来的程序员们通过整理把日常用的函数进行合并,形成一份完整的函数库,就是现在的标准函数库,例如:glibc 静态链接库: 函数库源代码经过只编译不链接形成的.o目标文件,然后通过ar工具将.o文件归档成.a静态链接库文件 商业公 阅读详情

静态链接库

前言

静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标是库),通常静态库以".a"为后缀,名字格式一般为libxxx.a。静态库由程序ar生成。

实例程序如下:

Main.c

#include <stdio.h>

extern void print_hello();

int

main(void)

{

    print_hello();

}

Print_hello.c

#include <stdio.h>

void

print_hello()

{

    printf("hello\n");

}

 

  1. 生成静态链接库

    创建静态库的步骤:

    1. 生成目标文件。(使用命令gcc –c file.c)
    2. 使用工具ar对目标文件进行归档。(使用的命令如下)

    生成静态链接库,或者将一个obj文件加入到已经存在的静态库的命令格式为:

    ar –rcs 库文件obj_1 obj_2 …

    使用上面的实例程序print_hello.c创建静态链接库:

  2. 使用静态链接库

    使用方式一:

    使用方式二:

    注意,在方法二中"-L./"不可少,否则出现如下错误:

    这是因为上面的命令在系统默认的路径下查找hello函数库,而我们并没有将libhello.a库放在系统默认搜索路径下,所以需要显示指定库函数的路径为当前目录。

    另外还需注意,在使用-l选项时,-o选项的目标名称要在-l链接的库名称之前,否则gcc会认为-l是生成的目标而出错。

    下面两个图分别是头文件和库文件的默认搜索路径:

动态链接库

前言

动态链接库是程序运行时加载的库,当动态链接库正确安装后,所有的 程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,目标文件在动态链接库中的组织方式是按照特殊方式形成的。库中函数和变量的地址是相对地址,不是绝对地址,其真实地址在调用动态库的程序加载时形成。

    动态链接库的名称有别名(soname)、真名(realname)和链接名(linker name):

    别名:libxxx.so,这种形式的库名正是执行编译命令时编译器要搜索的名字。

    真名:动态链接库的真实名称,一般总是在别名的基础上加上一个小版本号、发布版本等构成。

    链接名:程序链接时使用的库的名字。

  1. 生成动态链接库

    生成动态链接库的命令很简单,使用-fPIC选项或者-fpic选项。-fPIC和-fpic选项的作用是使得gcc生成的代码是位置无关的,例如下面的命令将print_hello.c编译生成动态链接库:

    其中-shared选项告诉编译器生成一个动态链接库;-soname,libhello.so表示生成动态库的别名是libhello.so;-o libhello.so.1选项择表示生成名字为libhello.so.1的实际动态链接库文件。

    生成动态链接库之后一个很重要的问题就是安装,一般情况下将生成的动态链接库复制到系统默认的动态链接库的搜索路径下,通常有/lib,/usr/lib,/usr/local/lib,放到其中任何一个目录下都可以。

  2. 动态链接库的配置

    动态链接库并不是可以随意地使用,要在运行的 程序中使用动态链接库,需要指定系统的动态链接库搜索的路径,让系统找到运行所需要的动态链接库才可以。

    系统中的配置文件/etc/ld.so.conf是动态链接库的搜索路径配置文件。这这个文件内,存放着可被Linux共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除外,这两个目录默认就是动态链接库的搜索路径),多个目录名间以空白字符(空格、换行等)或冒号或逗号分割。查看系统中的动态链接库配置文件的内容:

    Linux的配置文件将目录ld.so.conf.d/中的配置文件包含了进来。

  3. 动态链接库管理命令

    为了让新增加的动态链接库能够被系统共享,需要运行动态链接库的 管理命令ldconfig。ldconfig命令的作用是在系统的默认搜索路径和动态链接库配置文件中所列出的目录里搜索动态链接库,创建动态链接库装入程序需要的链接和缓存文件。搜索完毕后,将结果写入缓存文件/etc/ld.so.cache中,文件中保存的是已经排好序的动态链接库名字列表。

    ldconfig命令的用法如下:

  4. 使用动态链接库

把当前工作目录(libhello.so.1所在的目录)加入动态链接库的搜索路径配置文件/etc/ld.so.conf中:

执行ldconfig命令刷新缓存文件/etc/ld.so.cache:

我们会发现,执行ldconfig命令后,当前目录下生成了一个新的文件libhello.so(这是-soname,libhello.so选项导致的,如果没有该选项,那么ldconfig执行后不会生成新文件libhello.so。),使用ls命令会发现此文件是libhello.so.1的链接文件:

在编译程序时,使用动态链接库和静态链接库是一致的,使用"-lxxx"的方式:

编译后执行时出现如下错误:

其主要原因是使用了SELINUX。将其状态设置为disabled即可,方法如下:
打开/etc/selinux/config,将selinux=enforcing或permissive改成disabled。然后存盘退出,重启系统。

再次执行,结果如下:

运行时,还可能出现这样的错误:test: error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory,这是由于程序运行时没有找到动态链接库造成的。程序编译时链接动态链接库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。有几种办法可以解决此种问题:

  1. 将动态链接库的目录放到程序搜索路径中,可以将库的路径添加到环境变量LD_LIBRARY_PATH中实现:

  1. 使用ld-Linux.so.2来加载程序,命令格式为:

/lib/ ld-Linux.so.2 –library-path 路径 程序名

加载test程序的命令为:

不过貌似并不是所有系统上都有ld-Linux.so.2。

注意,如果系统的搜索路径下同时存在静态链接库和动态链接库,默认情况下会链接动态链接库。如果需要强制链接静态链接库,需要加上"-satic"选项。

动态加载库

前言

    动态加载库和一般的动态链接库所不同的是,一般动态链接库在程序启动时就要寻找动态库,找到库函数;而动态加载库可以用程序的方法来控制什么时候加载。动态加载库主要有函数dlopen()、dlerror()、dlsym()和dlclose()来控制动态库的使用。函数原型如下:

  1. 打开动态库dlopen()

    函数dlopen()按照用户指定的方式打开动态链接库,其中参数filename为动态链接库的文件名,flag为打开方式,一般为RTLD_LASY,函数的返回值为库的指针。

    例如,下面的代码使用dlopen打开当前目录下的动态库libhello.so:

    void *phandle = dlopen("./libhello.so", RTLD_LAZY);

  2. 获得函数指针dlsym()

    使用动态链接库的目的是调用其中的函数,完成特定的功能。函数dlsym()可以获得动态链接库中指定函数的指针,然后可以使用这个函数指针进行操作。其中参数handle为dlopen()打开动态库后返回的句柄,参数symbol为函数的名称,返回值为函数指针。

  3. 使用动态加载库实例

    #include <stdio.h>

    #include <dlfcn.h>

     

    int

    main(void)

    {

        void (*printhello)(void);

        void *phandle = NULL;

        char *perr = NULL;

        phandle = dlopen("./libhello.so", RTLD_LAZY);

        if(!phandle)

        {

            printf("Failed load library!\n");

        }

        perr = dlerror();

        if(perr != NULL)

        {

            printf("%s\n", perr);

            return(0);

        }

     

        printhello = dlsym(phandle, "print_hello");

        perr = dlerror();

        if(perr != NULL)

        {

            printf("%s\n", perr);

            return(0);

        }    

     

        (*printhello)();

     

        dlclose(phandle);

        return(0);

    }

    编译运行:

    注意,想要使用dlfcn.h中的函数,编译时必须加上选项-ldl。

小发现:

  有没有注意到,我们并没有使用用到include <hello.h>(假设我们为print_hello.c写了一个hello.h的头文件)。其实,只要编译命令中加入选项-lhello,hello.h头文件包含不包含都没有问题。为了验证这个问题,使用http://www.cnblogs.com/nufangrensheng/p/3518411.html中的程序清单11-1这个实例进行了测试:

  在http://www.cnblogs.com/nufangrensheng/p/3518411.html程序清单11-1编译过程中,曾遇到undefined reference to ‘pthread_create’这样的错误,原因在于没有在编译命令中加入-lpthread选项。

  如果我们加入了-lpthread选项,此时尝试着把程序中的#include <pthread.h>去掉,重新编译你会发现同样也是可以的。

  总结:如果使用的是标准库中的函数,则只需将头文件包含进来。如果使用的函数所在的库不是标准库(例如我们自己编写的库或标准以外扩展的库),则在编译时必须加入-lxxx选项,而头文件则可以包含也可以不包含,包含进来显得规范而已。

STM32F4与LAN8720硬件连接避坑指南:从原理图到RMII信号完整性的实战解析 本文深入解析了STM32F4与LAN8720以太网连接的硬件设计要点与常见陷阱。重点剖析了电源上电时序、复位电路设计、RMII接口配置等关键环节,并提供了从原理图设计到PCB布局、信号完整性调试的完整实战指南,帮助硬件工程师规避设计风险,确保以太网通信的长期稳定运行。 阅读详情

相关推荐

STM32硬件SPI驱动ADS1255/1256避坑指南:从Cube MX配置到稳定采样实战

本文详细解析了使用STM32硬件SPI驱动高精度ADC芯片ADS1255/1256的完整流程与关键陷阱。重点阐述了Cube MX中SPI模式(必须为CPOL=1, CPHA=1)、数据帧格式(MSB First)及波特率(建议从256kHz起)的正确配置,并提供了分步读写时序的代码实现与逻辑分析仪调试方法,帮助开发者避开常见坑点,实现稳定可靠的高精度数据采样。

weixin_29193259的博客 358

【操作系统实验8】静态链接、动态链接、动态加载实验

了解和掌握静态链接、动态链接以及动态加载之间的区别。

qq_44394952的博客 1210

FIFO Generate IP核使用——FIFO写操作详解及Status Flags页配置

本文介绍了FIFO的写操作及Status Flags页的配置信息。

u011565038的博客 2283

通俗举例讲解动态链接、静态链接

b可执行文件执行时,遇到sayHello,就去动态库so中找这个函数的实现位置,这个找的位置有几类,我们经常用的是一个环境变量,叫LD_LABRARY_PATH,假设这里找到了,找到之后就将a.so加载到内存,链接,进行执行。静态链接另一个问题是对程序的更新,部署和发布也会很麻烦,我如果在a中更新了sayHello,那么生成的b,c可执行文件里的sayHello还是老的,需要重新连接,很麻烦耦合度很高。c执行时再用到a.so,此时a.so以及被加载到了内存中,所以不用再重新加载了,直接链接就能使用了。

zxyOVO的博客 1651

保姆级教程:如何用Le2i Fall Detection Dataset训练你的跌倒检测模型(附数据集下载)

本文提供了一份详细的实战指南,教你如何使用Le2i Fall Detection Dataset训练跌倒检测模型。内容涵盖数据集的深度解析、预处理与工程化管道搭建、模型选择与训练策略,以及评估优化与部署考量,旨在帮助开发者从零构建高精度、可应用的跌倒检测系统。

assembly8low的博客 1287

2026深度破解:OpenClaw开源AI框架架构与实战全景解析

2026年初,一款名为OpenClaw的开源AI Agent框架以惊人的速度席卷全球开发者社区,短短数周GitHub星标突破20万,成为史上增长最快的开源项目。本文从架构设计、核心原理、代码实现和工程实战四个维度,深度剖析OpenClaw的技术内核,帮助开发者从理解到实践,快速掌握这一革命性的AI开发框架。

fox0329的博客 2373

动态加载和动态链接的区别

详解动态链接和动态加载的区别

Qstar666的博客 1493

共封装光学(CPO):下一代互联革命

Nvidia:产品:Quantum-X Q3450(115.2T,144×800G,2025H2上市)、Spectrum 6800(409.6T,512×800G,2026H2上市);技术路线:TSMC COUPE封装、MRM调制器、光栅耦合、外部激光源(Lumentum/Ayar Labs供应);战略定位:以横向扩展CPO验证供应链,最终聚焦纵向扩展场景(Feynman架构)。

存储随笔 4963

程序员的自我修养--链接、装载与库笔记:运行库

1. 入口函数和程序初始化 程序从main开始吗?:操作系统装载程序之后,首先运行的代码并不是main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所需要的环境,并且负责调用main函数,这时候你才可以在main函数里放心大胆地写各种代码:申请内存、使用系统调用、触发异常、访问I/O。在main返回之后,它会记录main函数的返回值,调用atexit注册的函数,然后结束进程。 ...

网络资源是无限的 1545

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 402

骑砍Ⅱ霸主MOD开发(5)-2D界面

本文介绍了2D界面开发的技术框架,主要包括以下内容: 2D界面架构:由多个GauntletLayer(菜单/对话框/定制页面)和SceneLayer(3D页面)组成,支持屏幕切换和管理。 GauntletLayer实现:采用Movie(HTML页面)+ViewModel(动态数据)模式,支持优先级管理、焦点控制和事件响应。 2D控件系统:包括颜色字体、坐标布局、背景图(Sprite/Texture)等配置方式,支持自定义控件开发。 定制化页面开发:详细说明了游戏菜单和对话框的实现方法,包括状态管理、事件回调

骑砍战团&霸主MOD开发 1181

【转】静态链接库、动态链接库和动态加载库

转自:https://www.cnblogs.com/nufangrensheng/p/3578784.html 静态链接库 前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标是库),通常静态库以".a"为后缀,名字格式一般为libxx...

weixin_30542079的博客 117

深入浅出:使用Python爬取链家二手房数据

在数据驱动的时代,房地产数据作为社会经济的重要指标,一直是数据分析师、投资者和研究人员关注的焦点。链家作为国内领先的房产中介平台,其二手房数据具有较高的真实性和时效性。然而,官方API的访问限制和数据获取的门槛,让很多初学者望而却步。本文将带你从零开始,使用Python编写一个符合robots.txt规范的链家二手房爬虫,获取标题、户型、价格等信息。文章不仅会提供完整代码,还会深入讲解反爬策略、请求头伪装、数据解析、异常处理等实战技术。目录前言:为什么要写这篇博客?一、爬虫前的准备:法律与道德。

2201_76125261的博客 90

c语言静态链接库和动态链接库以及动态加载库

1 需求2 语法3 示例4 参考资料Linux | c语言静态链接库和动态链接库以及动态加载库_动态加载和动态链接_frozen122的博客-优快云博客

深度安全实验室 343

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度学习工具包 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")

Linux | c语言静态链接库和动态链接库以及动态加载库

意外的出现了我也可以理解的一节,写个博客记录一下。 基础知识:编译过程 自定义头文件 静态库 动态库 编译过程 C语言的编译链接过程就是由源代码产生可执行文件的过程,主要包括预处理->编译(汇编)->链接三个过程。 预处理 将test.c/cpp/asm文件处理为中间文件,过程包括了对伪指令(宏定义,条件编译,头文件包含指令等以#开头的指令)和特殊符号的处理 编译(汇编) 将中间文件处理为test.o/obj文件 编译程序就是对词法和语法分析,确认合法后将其翻译成等价的中间代码表示或汇编代码

frozen122的博客 1685

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

linux下的动态链接库和静态链接库到底是个什么鬼?(三)动态加载库

前两天搞明白了动态链接库和静态链接库,后面终于也基本上搞懂了我之前不明白的“dlopen”是咋回事,怎么也要扒一扒。 共享库,有两种形式,第一种就是在上一篇文章中说到的“动态链接库”,而共享库的另一种形式,则被称之为“动态加载库”,也就是我刚才提到的用“dlopen”方式来玩的。动态加载库在编译的时候,应该是不需要去-l引用lib,而是在可执行程序中,可以自已决定加载库...

weixin_30480583的博客 108

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

静态链接库和动态链接库的区别

目录 1、链接库概述 2、静态链接库 2.1、编辑测试文件 2.2、将.c 编译生成 .o文件 2.3、由 .o 文件创建.a静态库 2.4、在程序中使用静态库 2.5、生成目标程序main,然后运行 3、动态库(隐式链接) 3.1、由 .o创建.so动态库 3.2、隐式方式使用动态库 3.3、动态库的初始化和解析 1、动态库的构造和析构函数机制 2、全局变量初始化 4.........

weixin_36670529的博客 4372

静态链接库与动态链接库

目录 静态链接库与动态链接库含义 静态链接库与动态链接库区别 加载方式: 性能与大小 支持嵌套链接 动态链接库的静态加载(调用)与动态加载(调用) 例子--静态链接库 创建静态链接库: 调用该静态库: 例子--动态链接库 创建动态链接库 动态加载动态链接库 静态加载动态链接库 DLL接口及变量导出 导出变量 在应用工程中引用DLL中全局变量 DLL导出类 ...

umg103的博客 751

【基础】动态链接库/静态链接库的区别

C或C++程序从源文件到生成可执行文件需经历4个阶段分别为预处理、编译、汇编和链接。链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。采用静态链接方式实现链接操作,的库文件称为静态链接库;采用动态链接方式实现链接操作,的库文件称为动态链接库。在Linux发行版系统中,静态链接库文件的后缀名通,动态链接库的后缀名通;,动态链接库的后缀名。...

weixin_41838721的博客 8122

静态链接库与动态链接库详解

以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 9307

静态链接库和动态链接库

简单对比介绍静态链接库和动态链接库,以及二者的创建和使用方法。

紫荆书香的专栏 971
上一篇: IP查询接口
下一篇: 托管代码与非托管代码
HideInTime
博客等级 码龄9年 86粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值