首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言---静态VS动态

C语言中,函数文件分为两种类型,一种是静态程序是直接注入目标程序,不分彼此,文件通常以.a结尾),另一种是动态程序是在运行目标程序时(中)加载文件通常以.so结尾),下面我们就探索一下这两种文件特点和使用方式吧...例如hello.c打印函数printf,这个函数不是凭空出现,在链接过程中就要连同对应文件一起打包,最终可执行文件才能正常运行。 静态VS动态 静态动态载入时间是不一样。...静态动态最大区别是,静态链接时候把直接加载到程序中,而动态链接时候,它只是保留接口,将动态与程序代码独立,这样就可以提高代码可复用度和降低程序耦合度。...无论静态,还是动态,都是由.o文件创建。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。...编译动态 还拿hello.c来说,使用下面的命令就可以生成一个动态文件libhello.so 。看一下各个参数含义。

8.9K45

C语言C语言标准梳理(超全)

C语言C语言标准梳理(超全)) 博主介绍 前言 显示8进制和16进制 字符串I/O 定义字符串 字符串函数 前言 C89 标准总共划分为 15 个部分,每个部分用一个头文件描述,C99 标准新增了...同样还有 %c 打印字符, %e, %Le 打印浮点值。还有一些特别的,例如 %zd 强制转换为整型打印。...可移植类型 C语言中有很多数据类型,但是在不同设备和系统中每个数据类型所占内存可能不同,C99新增了两个头文件 stdint 和 inttypes.h 来确保在各个系统中功能相同。...me32); return 0; } 参数 PRID32 被定义在inttypes.h中,用于替代d , 这条语句等价于printf("me32 = %" "d" "\n", me32);, 这里可以看出C语言另一个特点...,因为在 C11 中 gets() 方法已经被去掉,因为 gets() 函数是不安全,替代函数有两个: fgets() : 第二参数指明了读入字符串最长量,如果该参数为n,那么最多将会读入n-1个字符

2.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C语言动态内存管理总结

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 文章目录 为什么存在动态内存分配❓ 动态内存函数 malloc...这时候就只能试试动态存开辟了 动态内存函数 malloc和free 对于函数使用,我们首先要知道:malloc和free都声明在 stdlib.h 头文件中 C语言提供了一个动态内存开辟函数...有了动态内存开辟,那我们自然就要有回收和释放,C语言提供了另外一个函数free,专门是用来做动态内存释放和回收,函数原型如下 : void free (void* ptr); free函数用来释放动态开辟内存...,所以最合适方法就是把p置为NULL. calloc C语言还提供了一个函数叫 calloc , calloc 函数也用来动态内存分配。...总结 回顾一下,本篇博客我们主要介绍了C语言动态内存相关知识,从为什么会存在动态内存分配开始,逐渐深入,认识了动态内存函数以及相关使用,以及说明了一些常见动态内存错误。

    40620

    C++调用C语言写成动态链接

    1.C++和C生成符号信息不一样 C++在语法上是兼容C,但是这不代表使用C语言不做任何处理直接写成动态链接就可以被C++给调用。...这就导致C语言C++语言生成函数签名是不同,故不能不做任何处理直接调用。下面我们来看一下CC++编译同样一段代码为动态链接以后,它们函数符号信息有什么不一样。...在实际开发和应用中,你动态链接应该先进行“瘦身”。命令如下: ? 进行“瘦身”以后,符号信息等就被处理掉了,动态链接体积也会相应减少。我们就无法通过nm查看了,如下所示。 ?...2.如何使C++能调用C动态链接 C语言提供了extern "C"来使得C++能够调用C。...,我们把helloworld_c.c文件编译为动态链接,名为lib_helloworld_c.so 然后,把这个动态链接拷贝一份到/usr/lib下面即可。

    2.9K20

    C 语言动态封装与设计 ( Windows 动态简介 | Visual Studio 调用动态 )

    文章目录 一、Windows 动态简介 二、Visual Studio 调用动态 一、Windows 动态简介 ---- 在 C:\Windows\System32 目录中 , 存放着 Windows...中动态 ; 在 Visual Studio 项目中 , 选择 " 菜单栏 / 生成解决方案 " 选项 , 在项目的根目录中 , 生成 Debug 目录 , 在目录下生成了如下文件 : xxx.lib...是资源描述文件 , 用于描述 xxx.dll 动态 ; xxx.dll 动态 中包含了 函数 二进制机器码 , 也就是 函数体 代码 ; Windows 中 ( .dll 动态 ) 与 Linux...中 ( .so 动态 ) 动态规范不同 ; 二、Visual Studio 调用动态 ---- 拷贝动态文件 : 将编译出 xxx.lib 和 xxx.dll 文件 , 拷贝到 Visual...xxx.lib 文件查找对应 xxx.dll 动态文件 ;

    1.1K30

    c语言stl_c语言string

    今天推荐一个函数glib 注意不是glibc https://developer.gnome.org/glib/ 一直在抱怨,标准C中为什么没有类似于STL标准容器,让全世界程序员在数以万次重复实现它们...glib提供了动态数组、单/双向链表、哈希表、多叉树、平衡二叉树、字符串等常用容器,完全是面向对象设计,实现得非常精致。 你开发过跨硬件平台软件吗?是不是常常为硬件平台差异而苦恼呢?...字节顺序是常见问题之一,大端格式,小端格式,还是PDP格式?这样差异造成BUG会浪费不少时间,同时让代码晦涩难读。glib提供了一套完整宏,利用这些宏编写程序,问题大大简化了。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    3.9K10

    golang 学习(10): 使用go语言调用c语言so动态

    一、前言 最近在学习go,因为需要调用c语言打包成so动态库里面的方法,避免自己再去造轮子,所以想直接使用golang调用so,但是参考了其他博客大佬写,我每一步原封不动写下来,结果都是一堆错误...二、环境 因为要将c语言打包,会需要借助gcc工具,Windows 32位可以直接借助MinGW下载,Windows 64位用MinGW的话,后续打包运行时候会报错,x86_64这样错误...2、在目录下创建一个c语言头文件 hi.h 内容如下: void hi(); 3、在目录下创建一个c语言实现 hi.c 内容如下: #include void...} 5、编译c文件为so动态,命令: gcc -fPIC -shared -o libhi.so hi.c 这样会在当前文件夹下生成一个 libhi.so...解决办法:①、直接度娘 error while loading shared libraries,就会知道其实就是没有找到这个动态,我们编辑: vim /etc/ld.so.conf 文件,将我们路径写在该文件下

    4.3K10

    通过c语言调用系统curl动态示例

    在本文中,我们将通过一个简单示例来讲解如何在Ubuntu系统中通过C语言调用动态(共享方法。...准备工作 首先,确保我们Ubuntu系统已经安装了libcurl。...创建一个名为curl_example.c文件,并添加以下代码: c #include #include size_t write_callback(...小结 通过这个简单示例,我们演示了如何在Ubuntu最新版本系统中,通过C语言调用动态(libcurl)方法。这个过程主要包括安装、编写使用代码、编译程序并链接,以及运行程序。...学会了这些基本步骤后,你就可以开始探索和利用Linux系统中众多其他动态了。 在实际开发中,调用动态是常见需求,了解如何正确地链接和使用这些,能够大大提高开发效率和程序灵活性。

    22110

    C语言 | 什么是静态链接动态链接

    今天分享是静态链接动态链接相关知识,并且自己动手写一个简单静态函数动态函数,来体验这个流程。 首先要从函数发明开始说起。...我们在写C语言代码时候,一般都是先写 #include 这是一个标准输入输出头文件,因为我们可能要用到像printf这类函数,而这类函数就是包含在这个头文件当中。...商业公司通过发布.a文件和.h头文件来提供静态给客户使用。动态链接比静态链接出现晚一些,效率更高一些,是改进型。现在我们一般都是使用动态。...而动态不一样,动态链接本身不将库函数代码段链接入可执行程序,只是做个标记。...ii.制作动态链接 制作动态链接编译指令要稍作修改 lib: gcc test.c -o test.o -c -fPIC gcc -o libaston.so test.o -shared

    4.3K40

    C_C++_静态_动态制作和使用

    Linux平台下 动态、静态编译和使用; 动态和静态间接使用; 使用make + Makefile 来编译/构建动态、静态、应用程序; 使用cmake来编译/构建动态、静态、应用程序...Windows平台下 动态、静态编译和使用; 动态导出机制; 使用cmake+VS2017来编译/构建动态、静态、应用程序。 3. 大概就是这个样子 ? 视频演示步骤 1....Linxu平台 分别演示make + Makefile 和 cmake 来完成下面的操作: (1)libA输出动态,libB输出动态,编译可执行程序。...(2)libA输出静态,libB输出动态,编译可执行程序。 2....Windows平台 演示用cmake得到VS项目,然后完成下面操作: (1)libA输出动态,libB输出动态,编译可执行程序。 (2)libA输出静态,libB输出动态,编译可执行程序。

    99010

    C语言故事)

    ,而只需要链接文件即可,比如: gcc main.c -o main -L ..../lib -lx gcc main.c -o main -L ./lib -ly 上面的例子,就是链接了 libx.a 或者 liby.so,注意,名字是除去前缀 lib 和后缀之后名字。...既然有静态动态,那么他们有什么区别呢? 答案很简单,静态相当于卖书书店,动态相当于看书图书馆。...所以你会看到动态更多。另外再补充一点,因为动态编译之后,你并没有将代码拷到你程序里,而是等到你程序运行时候,才又来找到动态执行所需代码。...因此,运行一个连接动态程序,一般要设置环境变量LD_LIBRARY_PATH来告知系统动态具体位置,好让运行时能找到它。另外一种办法是编译时就告诉系统以后运行时动态位置。

    1.8K20

    C 语言动态封装与设计 ( 动态调用环境搭建 | 创建应用 | 拷贝动态相关文件到源码路径 | 导入头文件 | 配置动态引用 | 调用动态函数 )

    五、调用动态函数 一、在 Visual Studio 2019 中创建 " 控制台应用 " 程序 ---- 欢迎界面中 , 选择 " 创建新项目 " , 选择创建 " 控制台应用 " 项目类型..., 配置 项目名称 与 位置 , 项目创建完成后 , 初始程序是 C++ 程序 , 这里修改为 C 语言程序 ; 二、拷贝 xxx.lib、xxx.dll、xxx.h 到源码路径 ---- 将...动态 描述文件 xxx.lib , 动态文件 xxx.dll , 动态头文件 xxx.h , 拷贝到 项目的源码路径中 , 注意就是主函数源码所在目录 ; 三、导入 xxx.h 头文件 --...头文件 出现在 源文件 中 ; 将 xxx.h 头文件手动拖动到 " 头文件 " 中 ; 四、配置动态引用 ---- 右键点击 " 解决方案 " , 在弹出菜单中 , 选择 " 属性 " ,...选择 " 配置属性 -> 链接器 -> 输入 -> 附加依赖项 " " 编辑 " 选项 , 将 xxx.lib 选项 , 拷贝到此处 ; 五、调用动态函数 导入头文件 , 即可调用动态函数

    2.1K30

    c语言内联函数和动态链接制作和使用

    今天继续给大家分享c语言里面的内联函数使用以及动态链接制作和使用;内联函数使用,在很多交流群里面,看到有网友经常问到这一块(这个在Linux内核代码里面经常能够看到这种写法,平常代码里面我一般很少看到这种用法...,我们要明白为啥要用它,其实这个原因在之前文章c语言宏定义里面有讲过关于带参宏和函数区别和优缺点——C语言之宏定义用法;大家可以去看一下这个文章,我们写函数的话,无非就是要实现功能,然后我们在主函数里面去调用它...(2)如果函数体内出现循环(如while,以及switch),那么执行函数体内代码时间要比函数调用开销。 (3)不能做递归函数使用。...动态链接制作和使用 1.动态链接制作: 在我们gcc编译环境下默认使用就是动态链接,今天我们来自己制作动态链接。...: test.c:(.text+0x5):对‘fun1’未定义引用 collect2: error: ld returned 1 exit status 说明我们还没有用到我们动态链接(会显示找不到

    1.4K30

    c#封装动态_nginx调用so动态

    链接过程主要工作是符号解析和重定位。 2、 是一组目标文件包,就是一些最常用代码编译成目标文件后打包存放。而最常见就是运行时(Runtime Library),如C运行库CRT....一般分为两种:静态(.a 、.lib)动态(.so 、.dll )所谓静态、动态是指链接过程。 3、静态动态 区别: (1)lib是编译时用到,dll是运行时用到。...使用静态编译lib文件,在运行程序时不需要再挂动态,缺点是导致应用程序比较大,而且失去了动态灵活性,发布新版本时要发布新应用程序才行。...特点: 1)代码共享,所有引用该动态可执行目标文件共享一份相同代码与数据。 2)程序升级方便,应用程序不需要重新链接新版本动态来升级,理论上只要简单地将旧目标文件覆盖掉。...3)在运行时可以动态地选择加载各种应用程序模块 下面重点介绍Windows下动态链接DLL. DLL即动态链接(Dynamic-Link Libaray)缩写,相当于Linux下共享对象。

    2.7K20

    C++】动态内存管理 ① ( C 语言动态内存管理 | C 语言 内存申请 | C 语言 内存释放 | 代码示例 )

    一、动态内存管理 动态内存管理由 内存申请 内存释放 构成 , 这里内存指的是 堆内存 , 与之相对是 栈内存 ; 在 程序运行时 过程中 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源..., 包括 : 分配 堆内存 中 内存空间 释放 堆内存 中 内存空间 C 语言C++ 语言 中 , 都有 动态 分配 / 释放 堆内存 方法 ; C 语言中 , 主要是 堆内存 分配 与...释放 ; C++ 语言中 , 主要是 对象动态建立和释放 ; 二、C 语言动态内存管理 1、C 语言 内存申请 在 C 语言中 , 使用malloc()、calloc()、realloc() 等标准库函数来动态地申请内存...语言 内存释放 在 C 语言中 , 调用 free() 标准库函数 释放已申请内存 ; 3、代码示例 - C 语言动态内存管理 在下面的代码中 , 首先 , 使用 malloc() 函数 动态地申请了...可以存放 5 个 int 数据 堆内存 , // 函数原型 : void *malloc(unsigned int size); 然后 , 将 malloc 函数返回 void * 类型指针转为

    36030

    【Objective-C】Objective-C语言动态

    Objective-C语言动态性主要体现在以下3个方面   (1)动态类型:运行时确定对象类型。   (2)动态绑定:运行时确定对象方法。   ...一、动态类型   动态类型指对象指针类型动态性,具体地说就是使用id类型将对象类型推迟到运行时才确定,由赋给它对象类型决定该对象类型(说起来怎么这么绕口),也就是说id修饰对象是动态类型对象,其他在编译期指明类型为静态类型对象...在消息传递机制中,当开发者编写[receiver message:xxx]语句进行发送消息后,编译器都会将其转换成objc_msgSend C语言发送格式。...编译时:该阶段,编译器对语言进行编译,编译器只会对语言进行最基本检查报错、语法分析等,并将程序代码翻译成计算机能够识别的语言。那编译通过了,是不是就可以成功执行呢?你太单纯了,想美。   ...编译时就是一个静态阶段,类型明显错误,就会被直接检查出来,运行时时动态阶段,会将程序与开发环境结合起来。   OC是动态运行时语言,主要指的是OC语言动态性。

    1.7K20

    C++动态和静态_动态和静态调用方法

    1、前言 从事软件工作也有两年了,C++静态动态也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。...2、定义 静态动态从字面意思来看,区别就是静态和动态。而这里静态和动态指的是链接阶段。可以看如下编译过程。 静态:在链接阶段将会与目标汇编后目标文件.o一起打包生成可执行文件。...动态:而动态在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态链接是发生在程序运行时期,它和可执行文件是分开,只是可执行文件在运行某个时期调用了它。...3、 升级不方便,升级必须重新编译 动态 1、 动态可以实现进程之间资源共享,有一份就行 2、 升级程序简单,不需要重新编译 1、 运行期间在加载,将会减慢代码执行速度 2、 增加程序依赖项,必须跟着可执行文件一起...工程“属性面板”—》”配置属性” —》“C/C++” —》” 常规”,在“附加包含目录”属性值中,键入StaticLib.h 头文件所在目录路径或浏览至该目录。

    3.1K20
    领券