linux gcc 把静态链接库.a链接到动态链接库.so里

cygwin gcc 动态链接库问题 目录结构libtest/src/main.c libtest/lib/hello.c libtest/include/hello.h编译动态库cd lib gcc -I../include -fPIC -shared -o libhello.dll hello.c解决办法我本来生成的是libhello.lib,在linux系统上完全可以,但cygwin上就是不行,一直以为是gcc 的问题,搞了半 阅读详情

        最近公司的项目中突然出现了这样一个需求,我简化再概括后如下:有两大模块,其中一个模块a最终编译出一个可执行文件exec_a,另一个模块b编译出一个动态链接库lib_b.so被模块a的程序exec_a所链接。现在模块b中分出一个小模块c,需要独立成一个项目,它最终生成一个东西,提供给模块b,最后链接成动态库lib_b.so。因为c将会编译出多个.o目标文件,如果提供这些.o给b去链接是没问题的,但是这样来说很不人性化。把b和c两个库同时提供给a去链接,也能解决,但是偏偏a不希望知道和见到c。

        于是,我的做法如下,把c编译出一个静态库lib_c.a,提供lib_c.a给b去链接,所以就有了一个动态链接库链接静态库的问题了。这个平时用得不多,记录一下,在链接动态库b时,链接命令如下(默认大家都懂gcc和Makefile啊):

    $(CC) -shared -o lib_b.so $^ -Wl,--whole-archive -L. -lc -Wl,--no-whole-archive

        从上面这句编译命令看来就是多了
    -Wl,--whole-archive
       和
    -Wl,--no-whole-archive
        -Wl 都知道是把参数传递给链接器,而--whole-archive就是可以把在这个参数之后的静态库中的函数和变量输出到动态库中,而--no-whole-archive则是关掉这个功能。

        否则如果只是单纯地链接一个.a到.so中的话,这个动态库是不会有任何静态库中的内容的,最后链接到可执行文件时,也会出现找不到静态库中的内容。

        还有值得注意的就是,我习惯了每次编译后的release版本都strip一下,如果直接对刚刚编译出来的静态库strip操作的话,这个静态库就啥都没有了,因为它的东西没被任何东西所使用,所以全部被去掉了。之前因为这个问题折腾了半天还以为仍然是没有把这个静态库导到动态库去。

        本文到此结束!

使用CMake生成动态链接库(.dll和.so)和静态链接库(.lib和.a)的方法 对于大型软件开发,动态连接库是必不可少的。不仅可以实现模块的封装,而且可以实现软件的热更新(即替换windows下的.dll或Linux下的.so文件后直接实现软件更新,无需重新编译)。有时也需要使用静态链接库,在一定程度上相比于动态链接库运行速度更快。本文介绍使用CMake生成以及调用动态连接库和静态链接库的方法。 阅读详情

相关推荐

CST周期边界仿真:揭秘频率选择表面(FSS)单元设计全流程

本文详细解析了CST周期边界仿真在频率选择表面(FSS)单元设计中的应用全流程。从理论基础到工程实践,涵盖了求解器选择、几何建模、边界设置、端口优化等关键步骤,并提供了常见问题排查指南。通过CST仿真技术,工程师能够高效预测FSS的电磁特性,为实际应用提供可靠的设计依据。

weixin_30571465的博客 360

将静态库编译到动态库中

最近做一个东西,需要采集硬件设备的音视频数据,然后做编码。以前做过编码部分直接拽过来使用,只写硬件采集部分即可。调查发现,硬件采集驱动过于老旧,必须使用ffmpeg3的API,而编码部分则使用了ffmpeg4。 改动编码部分降级为ffmpeg3不现实,引出来多少问题不太确定。由此设计一套方案: 编码部分使用ffmpeg4的动态库,链接位置自己指定 将硬件采集代码设计为...

xy_kok的博客 7256

Cadence Virtuoso实战:用gm/Id方法搞定折叠式共源共栅放大器设计(附完整仿真流程)

本文详细介绍了在Cadence Virtuoso设计环境中,运用gm/Id方法高效设计折叠式共源共栅放大器的完整实战流程。该方法通过工艺特征曲线,将设计指标映射到晶体管尺寸与偏置,有效克服深亚微米工艺下传统方法的不足。文章以TSMC 180nm工艺为例,从指标拆解、参数查找、电路搭建、仿真验证到问题调试,提供了清晰、可复现的操作指南,并探讨了自动化脚本与版图考量,助力工程师和学生提升模拟IC设计效率与成功率。

jwt8token的博客 647

cmake中将静态库.a 链接到.so 动态库中

set_property(TARGET kaldi-native-fbank-core PROPERTY POSITION_INDEPENDENT_CODE ON) #核心是这句,设置位置无关,即添加-fPIC。

znsoft的专栏 1061

单节锂电池充电管理芯片应用原理阐述及应用领域

当电池电压超过2.9V时,采用恒流模式对电池充电,充电电流由PROG 管脚和GND之间的电阻RPROG确定。充电电压固定于4.2V,而充电电流可通过一个电阻器进行外部设置当充电电流在达到最终浮充电压之后降至设定值1/10时,WD4054将自动终止充电循环。在待机模式中,WD4054 对 BAT 引脚电压进行监控,只有当 BAT 引脚电压低于再充电阈值电压4.1V时(对应电池容量80%~90%),才会开始新的充电循环,重新对电池进行充电,这就避免了对电池进行不必要的反复充电,有效延长电池的使用寿命。

weixin_41141180的博客 945

Alphafold2/multimer本地安装避坑指南:从Conda环境配置到GPU加速实战

本文详细介绍了Alphafold2/multimer本地安装的全流程,从Conda环境配置到GPU加速实战,特别针对常见的报错处理提供了解决方案。通过硬件环境检查、依赖安装技巧、OpenMM补丁应用等步骤,帮助研究人员高效部署蛋白质结构预测工具,提升计算效率。

weixin_29309213的博客 116

Linux 6 共享库so的静态链接

1.首先编译.c文件 $gcc -c -fPIC -o sharelib.o sharelib.c -c表示只编译(compile),而不连接。 -o选项用于说明输出(output)文件名。 gcc将生成一个目标(object)文件sharelib.o。 -fPIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。 2.生...

分享各种网络协议知识 1795

告别黑窗口!用VSCode+Native Debug调试C/C++程序,比GDB命令行舒服多了

本文介绍了如何使用VSCode配合Native Debug扩展来调试C/C++程序,替代传统的GDB命令行方式。通过可视化调试环境,开发者可以更高效地管理断点、查看变量和调用栈,大幅提升调试效率。文章详细讲解了环境配置、核心调试功能及高级技巧,帮助开发者快速上手这一现代调试工具。

weixin_26833139的博客 251

CMake把静态库编译进入动态库

编译静态库的时候,需要加上-fPIC,告诉编译器产生与位置无关代码。这样编译出来的.a文件,才能被链接进动态库。不加这个编译选项,得到的.a文件,只能被链接进可执行文件,在链接进动态库是会报错,提示需要加这个选项。在CMakeLists.txt文件中,-fPIC可以这样添加。当尝试把静态库编译进入动态库时(类似如下的指令)

qq_34445574的博客 1139

gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成

城市道路网建模在获得基础路网之后,需要考虑道路交通网络的描述与表达问题。网络是将现实世界中的事物及其关系进行适当的抽象,构造成由节点和边按照一定规则组成的形式。一个实体网络可以由有限个“节点”集合与“边”集合构成的图表示,即网络表示为。对于一个由个节点组成的无权复杂网络,该图有邻接矩阵,这里。根据研究对象不同,建模方法主要包括原始法[1]和对偶法[2]两种,见图1,字母a-j为交叉口编号...

weixin_39761195的博客 3504

TC3XX - MCAL知识点(二十七):SENT Mcal配置及代码实战(单边半字节传输协议)

SENT协议只有一根线,异步传输!Sent协议的全称为Single Edge Nibble Trans .isson,单边半字节传输协议,是一种单线异步串行通信协议。Sent报文包含8个Nibble和一个校准位如图1所示,每一个Nibble数据被编码成PWM方式。设计这种协议的目的是用在与汽车ECU快速交互信息的传感器上,以此来取代低精确度的10bit AD和PWM。Sent是一种点对点的单方向从传感器到控制端的协议,控制器不需要同步信号。

梦想技术家 2272

动态库(.so)链接静态库(.a)的情况总结

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34356138的博客 858

爬虫Incapsula reese84加密案例:Etihad航空

声明:该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。

老衲爱洗头的博客 2429

动态链接库

C语言动态链接库1. 概述1.1 静态库和动态库1.2 动态链接库的优点2. 生成动态链接库2.1 windows版本2.2 Linux版本3. 调用动态链接库3.1 windows版本3.1.1 隐式调用3.1.2 显示调用(推荐)3.2 Linux版本 1. 概述 在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。 1.1 静态库和动态库 静态库:这类库...

liaoshenhao的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Linux下GCC编译过程及静态链接库和动态链接库

一 gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载变成了.i结尾的文件,可以通过-E这个参数来生成这个中间文件,这里主要是把一些include的头文件和一些宏定义,放到源文件中。 2从预加载的文件经过编译就会变成汇编语...

zjy900507的博客 1万+

怀旧版电脑GBC模拟器

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

gcc/g++静态与动态链接库

文章目录库文件静态链接库动态链接库库的生成与使用静态库动态库参考文章 库文件 首先说明要对库有一个比较直观的理解。库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都依赖很多基础的底层库,不可能每个人的代码都从零开始,公共代码需要反复使用,就把这些代码编译成为“库”文件,因此库的存在意义非同寻常。 本质上说来库是一种可执行代码的二进制形式(注,其本身不可执行),可以被操作系统载入内存执行。 我们在链接的时候有两种库:动态链接库和静态链接库 静态链接库 在链接阶段,会将汇编生成的目标文件.o与引用到的

Charles Ren's Tech Blog 8764

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Linux GCC编译使用动态、静态链接库

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。 例如有文件:hello.c x.h main.c 编译:gcc hello.c -fPIC -o libhello.so

God's blog 7万+

Linux_静态链接库与动态链接库

Linux平台下如何生成、调用静态库及动态库

zw_whusgg的博客 1476

linux 动态链接库(.so)的生成和引用

在使用动态链接库时,需要将库文件的名称和路径添加到程序中,以便程序能够在运行时找到库文件。在Linux系统中,可以使用ldd命令查看程序所依赖的动态链接库,使用ldconfig命令更新动态链接库缓存。在编译程序时,可以使用编译器的-l和-L选项指定需要链接的库文件。与静态链接库不同,动态链接库在程序运行时才会被加载到内存中,并且不会与程序的可执行文件一起打包。使用动态链接库的优势在于,它可以被多个程序共享使用,从而减少了程序的内存使用和磁盘空间占用。解决方式:将动态链接库的目录设置到环境变量中。

qq_38393271的博客 9525

Linux GCC编译过程及生成静态链接库和动态链接库

一 gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载变成了.i结尾的文件,可以通过-E这个参数来生成这个中间文件,这里主要是把一些include的头文件和一些宏定义,放到源文件中。 2从预加载的文件经过编译就会变成汇编语言的文件,这一步可以通过-S这个参数来生成这个中间文件 3从汇编语言的文件通过汇编,就会变成目标代码.o的文件...

2148

GCC(MinGW)编译动态链接库的方法

代码使用上一篇静态链接库的测试源代码。首先更正一个错误,上篇静态哭的基本操作中提到静态链接库的命名在Linux系统中是lib<name>.a,但实际上应该说对于静态链接库来说,.a文件可以在各种系统上运行。这一点明显区别于动态链接库。

Ian321的博客 1672

linux下用gcc创建静态链接库和动态链接库

上一篇文章介绍了在windows下如何创建静态链接库和动态链接库(http://blog.csdn.net/love_cppandc/article/details/8502773),这一篇介绍一下在linux下如何创建静态链接库和动态链接库。 在linux下,静态库文件是.a结尾,动态库文件是.so结尾。 1.静态链接库 首先创建3个文件:static.h static.c test.c

Sun_tester的专栏 2201

Linux下静态链接库与动态链接库的区别

通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件 (object file)与牵涉到的函数库(library)被链接合成一个可执行文件 (executable file)。程序 在运行 时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下。所以这些函数库被成为静态库(static libaray),通常文件 名为“libxxx.a”的形式。 其实,我们也可以把对一些库函数的链接载入推迟到程序运行的时期(runtime)。这就是如雷贯耳的动态链接库(dy

RICH_BABA的专栏 1万+
上一篇: 使用libcurl遇到的问题
下一篇: 如何让自己configure找到需要的库?
sunnyleevip
博客等级 码龄15年 7粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值