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

静态链接使用不同版本的C运行时库构建的库,好还是坏?

静态链接使用不同版本的C运行时库构建的库,可能会导致兼容性问题和程序运行不稳定。

在C语言中,运行时库提供了许多标准函数和系统调用,用于实现程序的基本功能。静态链接是指在编译时将运行时库直接链接到程序中,而不是在运行时动态加载。这意味着,如果在不同的系统上使用不同版本的运行时库构建程序,可能会导致兼容性问题。

例如,如果在一台使用glibc 2.30版本的Linux系统上构建程序,而目标系统使用glibc 2.28版本,则可能会出现兼容性问题。这是因为运行时库的不同版本可能会实现不同的功能,或者在内部数据结构和函数调用方式上有所不同。

此外,静态链接还可能导致程序运行不稳定。例如,如果程序使用了某个库的某个特定版本,而该库在更新时没有保持向后兼容性,则可能会导致程序运行时出现错误或崩溃。

因此,建议使用动态链接,以便在运行时加载正确版本的运行时库。这可以通过在程序中使用动态链接库(如共享库)来实现。动态链接库允许在运行时加载正确版本的库,并且可以在不重新编译程序的情况下升级库版本。

总之,静态链接使用不同版本的C运行时库构建的库并不是一个好的选择,因为它可能会导致兼容性问题和程序运行不稳定。建议使用动态链接,以便在运行时加载正确版本的运行时库。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

cgo构建引用c静态链接

背景 项目中免不了要使用c/c++工程代码,因此使用cgo引入c静态也是不可避免(虽然官方要求尽量使用go构建项目,而不是偷巧导入c代码,尽量保持go项目的纯粹,毕竟go和cgo是两码事)。...但是可以通过MinWG版本gcc/g++将代码编译成libxxx.a形式静态,即可完美引用,要求所生成静态名称必须以lib开头。...MinWG需要使用64位版本,下载地址 2 关于#cgo指令符 2.1 开发参数 #cgo指令符为c/c++编译器提供CFLAGS、CPPFLAGS、CXXFLAGS和LDFLAGS开发参数设置,同时也可以提供一些编译约束...CXXFLAGS 用来给c++编译器提供开关。 CPPFLAGS 用来给c预处理提供开关,对c/c++都有效。 LDFLAGS 用来指定链接选项,比如链接位置,以及使用哪些链接。...$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) main.c -o main 2.2 ${SRCDIR}变量 ${SRCDIR}变量用来指代原文件所在文件夹绝对路径,可以将预先编译静态放在

4.5K10
  • c语言里面静态链接制作和使用

    (4)动态链接静态链接出现晚一些,效率更高一些,是改进型。现在我们一般都是使用动态。...我们使用静态链接看看是什么 情况(gcc中编译链接程序默认是使用动态): root@ubuntu-virtual-machine:/home/ubuntu# gcc hello.c -static...从中我们可以发现使用静态链接生成可执行程序比较占用内存大小。 4.库函数使用: (1)gcc中编译链接程序默认是使用动态,要想静态链接需要显式用-static来强制静态链接。...静态链接制作和使用 1.自己制作静态链接: 这里我先在当前目录创建两个文件一个是hell.c ,另外一个是hell.h,然后在hell.c里面写上;  #include   void.../home/ubuntu/rest# ls hell.c  hell.h  hell.o  libhell.a  Makefile 2.使用静态链接: 上面创建好了静态链接,现在我们就来使用这个静态链接

    1.5K30

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

    这个应用模型是我们在开发过程中经常使用,例如:作为一名资深程序员,你需要为公司应用开发工程师提供一个轮子:modbus通讯。...但是在你libNB.so中一定要静态链接libmodbus,这样就只需要提供一个libNB.so就可以了(.h头文件当然是必须),应用开发人员就会惊叹:大牛就是大牛,这么快就搞定了!...相反地,如果你动态链接libmodbus,这样你就得提供2个文件给应用开发人员:libmodbus.so和libNB.so,这样就暴露了你偷懒高尚品德。 这个教程就是来演示这个编译和链接过程。...Linux平台下 动态静态编译和使用; 动态静态间接使用使用make + Makefile 来编译/构建动态静态、应用程序; 使用cmake来编译/构建动态静态、应用程序...Windows平台下 动态静态编译和使用; 动态导出机制; 使用cmake+VS2017来编译/构建动态静态、应用程序。 3. 大概就是这个样子 ? 视频演示步骤 1.

    1K10

    Linux静态链接使用类模板快速排序算法

    快速排序本质是从数组中选一个参考值ref,比该参考值,将其放在ref右边,比ref小放在左边,然后不断对两边重复执行该动作 我们先列出来快速排序步骤: 1.从数组中选一个参考值ref,比该参考值...原因是我们既然选是第一个,也就是a[p],同时表示是从数组第一个元素开始遍历。 选取j目的是,我们要时刻知道当前最近一次比ref小位置。...观察上述代码可以看到,j总是记录着最近一次比ref小游标,因此最后return j+1,所有比ref小游标均小于j+1,所有比ref大游标均大于j+2。...但是,假如我们选取refrefId是p到r范围内一个随机数呢? 显然,假如我们随机选取ref值,那么在partition过程中,refId对于ref就有可能和其他值交换。...下面给出C++代码实现 #include #include #include"stdlib.h" #include using namespace

    1.1K41

    Win32编程之静态编写与使用.动态链接编写与使用

    Win32编程之静态编写与使用.动态链接编写与使用 一丶什么是静态.什么是动态链接.   ...每个人编写自己东西.最后组合.   动态链接.也称为Dll. 为什么有了静态还要有动态链接. 原因是静态优缺点.所以才出了动态链接补充这个缺点. 缺点:   1.代码体积大....使用静态程序编译出体积很大.在汇编层次中就是把静态代码跟可执行文件相链接了.   2.重复代码多.一个静态可以有很多人编写.有得函数会有多次编写. 动态链接就是解决上面缺点....我们可以选择生成dll还是静态. 2.编写静态lib   如果我们创建了一个文件.那么很简单. 添加一个.h文件. 填加一个实现文件. ...int a,int b) { return a + b; } 直接编译.然后寻找目录下我们编译静态lib即可.  3.使用静态lib   使用我们静态lib很简单.   1.需要.

    73830

    C++程序编译之谜(二)——隐藏源码,动态和静态链接秘密

    静态链接链接时候程序会把静态链接所有函数插入到你可执行文件中,在这种链接方式下,函数代码将从其所在地静态链接中被拷贝到最终可执行程序中。...优点:可执行文件会比较小 缺点:运行速度比较慢 那么我们如何生成静态和动态,以下生成方法均是在Linux平台 2、静态链接 生成静态链接 首先生成.o文件 gcc -c add.cpp -...o add.o 或者直接这样也可以,默认生成也是.o文件 gcc -c add.cpp 生成静态链接静态命名规则lib+名字+.a ar rcs libadd.a add.o 生成可执行文件...gcc main.c libadd.a -o maina maina是利用静态生成可执行文件,这个实际上是比较简单写法,是头文件、源文件、链接都在同一目录情况,如果是在不同目录的话,就要这样...这里要记得一定要另开一个窗口执行,不然还是会这个错误。 以上就是静态和动态内容,涉及到了一些编译过程命令,所以后面我会和大家说下程序编译相关过程。

    24010

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

    今天继续给大家分享c语言里面的内联函数使用以及动态链接制作和使用;内联函数使用,在很多交流群里面,看到有网友经常问到这一块(这个在Linux内核代码里面经常能够看到这种写法,平常代码里面我一般很少看到这种用法...动态链接制作和使用 1.动态链接制作: 在我们gcc编译环境下默认使用就是动态链接,今天我们来自己制作动态链接。...这里制作一些步骤和昨天有点类似,但是也有不同地方,我挑重点来讲。...2.动态链接使用: 上面创建好了静态链接,现在我们就来使用这个静态链接,然后我在当前目录下再创建一个目录叫做testlib,然后把hell.h和libhell.so移到这个目录下面,同时在这个目录下面创建一个.../test hello 上面的动态链接制作和使用就成功了,这里再介绍一下ldd命令:作用是可以在一个使用了共享程序执行之前解析出这个程序使用了哪些共享,并且查看这些共享是否能被找到,能被解析

    1.5K30

    跨平台开发 -- C# 使用 CC++ 生成动态链接

    就Linux来说,Linux 本身是C语言开发,面向C语言有丰富接口支持和兼容,还有很多地方只能使用C语言。 底层应用可以用C语言来完成,如果要开发一个网站、一个大型应用程序呢?...我们可以先用 C 语言写好底层API接口,生成 .SO 动态链接,然后使用 C# 引入 C 语言动态链接。...利用C语言进行底层接口开发,使用.NET Core/C# 实现跨平台应用开发,通过预先自定义API,就可以掌控全局。 一,在Visual Studio 2017 上安装 C/C++ 支持 ?...二,写一个简单C语言程序、生成动态链接 创建项目后,点击属性,选择生成 .so ?...三,C# 项目使用此动态链接 建立一个.NET Core 项目,把 .so 文件复制进去,记得 “始终复制” ? ?

    1.5K10

    C++图形界面开发:使用图形构建用户友好GUI

    C++图形界面开发:使用图形构建用户友好GUI在软件开发中,图形用户界面(GUI)是用户与应用程序进行交互关键部分。一个用户友好GUI可以帮助提升用户体验,使应用程序更易于使用和理解。...在C++开发中,我们可以使用一些强大图形构建出漂亮且用户友好GUI。...选择合适图形在选择图形时,我们应该考虑到以下因素:跨平台性:确保图形能够在不同操作系统上运行,以便能够在各个平台上提供一致用户体验。...针对这些因素,以下是几个常用C++图形:Qt:Qt 是一个功能强大且跨平台图形,它提供了丰富控件和工具,使得构建用户友好GUI变得相对容易。...构建用户友好GUI无论我们选择了哪个图形,下面是一些构建用户友好GUI最佳实践和建议:使用直观布局:在设计界面时,应该使用直观布局来组织各个控件和元素。

    1.8K10

    在Docker中快速使用Oracle各个版本(从10g到21c数据

    为了测试需要,麦老师制作了各个版本Oracle数据环境,下载地址如下: # oracle nohup docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest...oracle19clhr_asm_db_12.2.0.3:2.0 init # 对于ASM,① ASM磁盘脚本:/etc/initASMDISK.sh,请确保脚本/etc/initASMDISK.sh中内容都可以正常执行...1521 -p 211:22 \ --privileged=true \ lhrbest/oracle_10g_ee_lhr_10.2.0.1:2.0 init 之前也详细说明过一些镜像使用方法...12.1.0.2)企业版环境 【DB宝14】在Docker中只需2步即可拥有Oracle 11g企业版环境(11.2.0.4) 【DB宝7】如何在Docker容器中一步一步安装配置Oracle19c...ASM+DB环境 【DB宝3】在Docker中使用rpm包方式安装Oracle 19c DB宝4 本文结束。

    1.7K50

    在Docker中快速使用各个版本(从10g到23cOracle数据

    镜像地址 为了测试需要,麦老师制作了各个版本Oracle数据环境,下载地址如下: # oracle nohup docker pull registry.cn-hangzhou.aliyuncs.com...nohup docker pull registry.cn-hangzhou.aliyuncs.com/lhrbest/oracle_10g_ee_lhr_10.2.0.1:2.0 & # 23c免费开发者版本...之前也详细说明过一些镜像使用方法,例如:11.2.0. 23c: https://www.xmmup.com/zaidockerzhongkuaisutiyanoracle-23cmianfeikaifazheban.html...www.xmmup.com/dbbao4zhixu2bujikeyongyouoracle19cdeasmdbhuanjing.html 【DB宝7】如何在Docker容器中一步一步安装配置Oracle19c...ASM+DB环境 【DB宝3】在Docker中使用rpm包方式安装Oracle 19c 【DB宝4】只需2步即可拥有Oracle19cASM+DB环境 18c: https://www.xmmup.com

    1.4K20

    Go 静态编译及在构建 docker 镜像时应用

    链接 什么是链接,为什么要有链接 链接是高级语言经过编译后得到二进制文件,其中包含有函数或数据,可以被其他应用程序调用,链接根据链接方式不同分为静态链接和动态链接。...链接两种类型 编译过程中编译器将源代码编译成目标文件,一般以 .o(object) 作为扩展名,之后链接器将多个目标文件链接成可执行文件或链接文件,链接根据被使用方式不同分为静态链接和动态链接...使用链接 使用静态链接 下面用 C 语言编写两个函数,并分别生成静态链接和动态链接,最后在另一个程序中使用生成链接。...下面是使用静态链接生成可执行文件图示: 使用动态链接 再看一个动态链接例子,代码还是一样,只是在生成链接和编译链接时候不太一样。...利用静态编译减小 docker 镜像体积 静态编译后二进制文件可移植性较好,只需要一个单独文件便可以运行,并且由于编译时环境要求与运行时环境要求不同运行时环境中不要求有编译链接等工具,所以可以利用这个区别在构建

    8510

    编译boost

    Boost由于其对跨平台强调,对标准C++强调,与编写平台无关。大部分boost功能使用只需包括相应头文件即可,少数(如正则表达式,文件系统等)需要链接。...编译可以到这里下载 链接:http://share.weiyun.com/712e3d95bb73d7378a8c34d3518d12f3 (密码:2LNF) 1、源码 源码下载可以直接去http...minimal(默认) 构建一个最小集(即只构建release版本。 在Windows上,构建debug和release模式下使用共享运行时静态多线程。...如果使用相同编译器构建Boost多个变体,此选项将非常有用。system二进制名称不包括Boost版本号或编译器名称和版本号。...构建单线程或多线程二进制程序 runtime-link=static/shared 静态还是动态链接CC ++运行时 address-model=32/64 寻址模式(生成32位还是64位)

    3.4K80

    动态静态优缺点比较分析_c静态和动态区别

    静态链接方法: gcc –o staticcode –L....–lstatic main.c –static(默认在当前文件夹) 共享链接方法: gcc –o sharedcode -L....不过由于运行时要去链接会花费一定时间,执行速度相对会慢一些,总的来说静态是牺牲了空间效率,换取了时间效率,共享是牺牲了时间效率换取了空间效率,没有区别,只看具体需要了。...另外,.一个程序编好后,有时需要做一些修改和优化,如果我们要修改刚好是库函数的话,在接口不变前提下,使用共享程序只需要将共享重新编译就可以了,而使用静态程序则需要将静态重新编译后,将程序再重新编译一便...本文仅限于介绍linux下 2.种类 linux下有两种:静态和共享(动态)。 二者不同点在于代码被载入时刻不同

    3.2K20

    两个奇技淫巧,将 Docker 镜像体积减小 99%

    02 多阶段构建 要想大幅度减少镜像体积,多阶段构建是必不可少。多阶段构建想法很简单:“我不想在最终镜像中包含一堆 C 或 Go 编译器和整个编译工具链,我只要一个编译可执行文件!”...静态指的是在链接阶段将汇编生成目标文件.o 与引用到一起链接打包到可执行文件中,因此对应链接方式称为静态链接(static linking)。...90 年代程序大多使用静态链接,因为当时程序大多数都运行在软盘或者盒式磁带上,而且当时根本不存在标准。这样程序在运行时与函数再无瓜葛,移植方便。...使用动态链接好处显而易见: 节省磁盘空间,不同程序可以共享常见。 节省内存,共享只需从磁盘中加载到内存一次,然后在不同程序之间共享。...04 总结 最后来对比一下不同构建方法构建镜像大小: 原始构建方法:1.14 GB 使用 ubuntu 镜像多阶段构建:64.2 MB 使用 alpine 镜像和静态 glibc:6.5 MB

    1.3K11

    你所不知道CC++运行库

    无聊,遂准备写一篇博客,介绍一下CC++运行库,只因发现工作几年的人对此一知半解大有人在。 在使用VC构建项目时,经常会遇到下面的链接错误: ?...为了方便有不同需求客户使用,VC++分别实现了动态链接DLL版本静态LIB版本。同时为了支持程序调试且不影响程序性能,又分别提供了对应调试版本。...而DLL版本名称根据编译器不同不同,我们可以从名称上加以分辨: VC6.0使用CRTDLL版本在MSVCRT.DLL中实现, 对应调试版本为MSVCRTD.LIB。...在各个版本编译器中,我们可以通过配置选项来设置程序使用CC++运行时类型。如下图(其他版本编译器大同小异): ? MT选项: 链接LIB版CC++运行库。...同时对于使用多个模块大型软件来说,如果每个模块均选择静态链接CC++运行库,在程序运行时就会存在多个运行库。在链接时也会出现重复定义问题,如文章首第一张图所示。

    1.6K10

    Google C++ 编程风格指南(二):作用域

    举例来说, 两个不同项目的全局作用域都有一个类 Foo, 这样在编译或运行时造成冲突....定义在同一编译单元函数, 被其他编译单元直接调用可能会引入不必要耦合和链接时依赖; 静态成员函数对此尤其敏感. 可以考虑提取到新类中, 或者将函数置于独立名字空间内....特别是,应使用初始化方式替代声明再赋值, 比如: int i; i = f(); // ——初始化和声明分离 int j = g(); // ——初始化时声明 vector v; v.push_back...静态变量构造函数、析构函数和初始化顺序在 C++ 中是不确定,甚至随着构建变化而变化,导致难以发现 bug....综上所述,我们只允许 POD 类型静态变量,即完全禁用 vector (使用 C 数组替代) 和 string (使用 const char [])。

    77630
    领券