gcc创建共享库

【gcc】 gcc编译动态库(共享库)、静态库|链接静态库、动态库 目录 即看即用 一、GCC 简介 GCC编译流程 GCC编译选项 二、GCC生成动态库和静态库 三、生成动态库和静态库实例 四、静态库和动态库的使用和配置 静态库的使用 共享库的使用 不到你指定链接的so错误 编译链接静态库、动态库 链接动态库 即看即用 多个源文件/目标生成动态库 a. gcc -fPIC -shared ... 阅读详情
 首先有必要介绍一下静态库和动态库的区别。简单的说静态库就是在生成可执行文件的时候把用到的函数代码加入到其中。而动态库只是在运行的时候才会被加载。
动态库的应用有两个主要原因:  
 1.    共享。多个程序可以使用同一个动态库  
 2.    开发模式好。要求设计者对功能划分得更好  
但动态库装载的时候慢,特别是运行中装载有明显延迟。
静态库的优点:  
  代码装载速度快,执行速度略比动态库快,没有什么更多的优势。

下面介绍一下在linux下实用gcc创建共享库的方法。
构建共享库最基本的一步就是编译库中的对象模块。还是通过例子来说明吧。两个源文件如下:
  1 /* shellofirst.c    */
  
2 #include <stdio.h>
  
3 void shellofirst()
  
4 {
  
5      printf("The first hello from a shared library ");
  
6 }
  1 /* shellosecond.c */
  
2 #include <stdio.h>
  3 void shellosecond()
  
4 {
  
5     printf("The second hello from a shared library ");
  
6 }


使用下列命令可将这两个源文件编译成一个目标文件:$ gcc -c -fpic shellofirst.c shellosecond.c
选项-fpic使得输出的对象模块是按照可重定位地址方式生成的。缩写pic代表位置独立代码(position independent code)。
下列命令使用目标文件构造共享库hello.so
$ gcc -shared shellofirst.o shellosecond.o -o hello.so
共享库hello.so就构造完毕了。下面编写主程序测试共享库的使用。
  1 /* stwohellos.c */
  
2 void shellofirst(void);
  
3 void shellosecond(void);
  
4 int main(int argc,char *argv[])
  
5 {
  
6     shellofirst();
  
7     shellosecond();
  
8     return(0);
  
9 }

~

使用下列命令将该程序编译并连接到共享库:
$ gcc stwohellos.c hello.so -o stwohellos

一旦程序被连接,为了使用共享库,就必须在运行的时候能够找到共享库的位置 。gcc载入程序并运行的时候,共享库应该位于一下位置:
    1. 环境变量LD_LIBRARY_PATH列出的所有用分号分割的目录
    2.文件/etc/ld.so.cache中找到的库的列表,由工具ldconfig维护。
    3.目录/usr/lib
    4.目录/usr/local/lib
所以为了运行我们的程序,必须使用上面列出的四种方法中的一种使程序可以定位到共享库。
我们使用命令ldd查看程序使用了哪些库,命令及执行结果如下:

$ ldd stwohellos
        linux
-gate.so.1 =>  (0x00fdd000)
        hello.so 
=> not found
        libc.so.
6 => /lib/libc.so.6 (0x49856000)
        
/lib/ld-linux.so.2 (0x48e85000)

从中可以看到我们自己创建的共享库hello.so没有找到,现在试图运行程序会产生如下错误:

./stwohellos: error while loading shared libraries: hello.so: cannot open shared object file: No such file or directory


错误已经很明显了,就是我们的程序无法定位共享库。在这里我们使用第一种方法解决这个问题,输入如下命令:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

在共享库的搜索路径中加入当前目录,然后运行程序即可。
$ ./stwohellos
The first hello from a shared library
The second hello from a shared library
Linux 创建共享对象,共享库并安装使用共享库 linux的共享对象与Window下的动态链接文件是一个等价的概念,但是不同的操作系统对共享对象的存储方式不同。而Linux 的共享库也是共享对象的形式,是将多个源文件编译为一个共享对象的方式,这个共享对象就是共享库,现在共享对象与共享库的概念已经不再着重区分。 1. Linux 编译共享对象 假设现有源文件 a.c ,将其编译为共享对象的语句为: gcc -shared -fPIC a.c 阅读详情

相关推荐

GCC编译工具链与共享库的使用

本博客深入探讨了GCC编译器的使用,包括如何编译和链接多个源文件,以及如何创建和使用共享库。介绍了GCC的多种编译选项,例如用于指定输出文件名、控制编译过程的结束与否、支持语言标准的选项等。同时,文章也对编译器的警告级别、调试、优化和硬件选项进行了详细的说明,旨在帮助读者更高效地使用GCC工具链。

weixin_33480380的博客 518

【Linux系统编程】静态库和共享库

📣专栏定位:整理一下 C++ 相关的知识点,供大家学习参考~🎏唠叨唠叨:在这个专栏里我会整理一些琐碎的 C++ 知识点,方便大家作为字典查询~

Newin2020的博客 883

无刷电机控制基础(2)——有感和无感驱动、调速

上一篇文章我们讲了一些无刷电机的基础知识,包括无刷电机的内部结构,驱动原理等,我们知道了只需要按照转子的当前位置,来按顺序给定子线圈通电,就能让电机转动起来。但是,上一篇中我们跳过了一个关键步骤,就是如何检测转子的位置。本篇我们就讲讲常用的位置检测方法,以及引出的一些相关问题。我们知道,获取磁铁的位置可以用霍尔传感器,无刷电机的转子就是永磁体,因此只要在合适的位置安装霍尔传感器,就能知道转子的旋转位置。在无刷电机中,一般用3个开关型霍尔器件就能检测转子的位置。

小白白学电子 2万+

Linux (gcc以及共享库的使用)

Linux (gcc以及共享库的使用)

nnan77的博客 559

BDD测试之Behave使用入门

BDD测试(Behavior-Driven Development Testing)是一种基于“行为驱动开发”(BDD)理念。

想要成为酷盖但是失败的小明 580

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 936

linux gcc 动态共享库基础知识

对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧。 一、GNU gcc的编译工具用法 我们先来写一个简单的C程序:hello.c C代码 #include      void print_hello() {     printf("Hello W

baozhongchao的专栏 815

【目录】专栏文章导航

从最强工具链Davinci Configurator模块学习出发掌握AUTOSAR

weixin_47571898的博客 3297

共享库的创建gcc选项“-shared -fPIC -WI”

位置无关代码是一种可以在内存中的任何位置加载和执行的代码,不依赖于特定的内存地址。这对于共享库特别重要,因为共享库可以加载到内存的任何位置,并且多个程序可以共享同一个共享库的单个实例。当你链接一个共享库(DLL)时,导入库中包含了导出函数的符号列表,使得链接器能够在编译时解析这些符号。表示输出结果是共享库类型。共享库是一种包含可重用代码和数据的二进制文件,可以被多个程序共享,并在运行时动态加载到内存中。这意味着多个程序可以在运行时共享相同的库,减少了代码的冗余性,并提高了系统资源的利用率。

专注音频,高效工作,快乐生活! 975

【小白深度教程 1.32】手把手教你从多视角图像进行 3D 重建(SfM 算法)

重建的目标是从一组照片中推导场景的几何结构,假设摄像机位置和内部参数是已知的或可以从图像集中猜测。 这是通过使用多个照片,在其中应用运动结构法(Structure from Motion,SfM)来解决像素级对应问题,部分地恢复3D信息来实现的。

2401_87064292的博客 2160

156、手机摄像头模组结构拆解:从保护盖到 FPC 连接器的完整装配剖面

本文深入解析手机摄像头模组结构设计要点。作者结合项目经验,指出保护盖密封胶在低温收缩会导致边缘漏光问题,强调结构细节比算法参数更关键。文章逐层拆解模组组件:保护盖厚度需平衡抗冲击与光学性能;镜筒内镜片组装配顺序和公差控制直接影响成像质量;IR滤光片厚度公差±0.02mm会改变红外截止波长;CSP封装需注意金线加固;FPC连接器的信号完整性和机械可靠性设计。最后给出5条实用建议,包括密封胶选型、镜片对位检测等,强调模组结构设计是"一票否决制"的基础工程。(149字)

sundong_81的博客 105

在Linux上用GCC创建共享库(Shared libraries with GCC on Linux)

英文原文:http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html          库是程序员必须的工具,它是已经编译过的代码。库通常提供通用的功能,例如链表和二叉树等数据结构,或者特定的功能,例如MySQL等数据库服务器访问接口。          多数大型软件项目有多个部件组成,这些部件有可能在其它项

天天water的专栏 4871

【毕设级教程】从0到1实现基于YOLOv8的xView卫星图像目标检测系统(含UI界面,助力遥感智能毕设)

本文基于YOLOv8模型设计了一个面向xView卫星图像的目标检测系统。首先对xView数据集进行了格式转换处理,将原始多边形标注转换为YOLO格式的边界框标注。随后通过配置YOLOv8模型参数完成训练,实现了对卫星图像中建筑、车辆等多类目标的准确识别。为提高系统交互性,采用PyQt开发了可视化界面,支持图像选择、实时检测和结果展示功能。整个系统兼顾学术价值和实用价值,为遥感领域的自动化目标检测提供了可行方案。

m0_64661770的博客 130

gcc创建静态库和共享库

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

weixin_34349320的博客 114

RK3399平台入门到精通系列讲解 - 总目录

欢迎大家来到内核笔记的《RK3399平台开发入门到精通系列讲解》,开始前博主先列出RK3399平台学习的大纲,同时这也可以作为大家学习RK3399内核与安卓框架的参考。下面蓝字都是传送门,点击进入即可:...

内核笔记 10万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

使用GCC创建静态库与共享库

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

weixin_34186950的博客 101

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

gcc生成反汇编 linux_如何创建一个可执行的 Linux 共享库

本文首发于 如何创建一个可执行的共享库前言前段时间,有多位同学在“泰晓原创团队”微信群聊到 C 语言相关的两个问题:如何让共享库文件也可以直接执行如何在可执行文件中用 dlopen 解析自身的函数这两个需求汇总起来,可以大体理解为如何让一个程序既可以作为共享库,又能够直接运行。这类需求在 Linux 下面其实很常见,比如 ld-linux.so 和 libc.so:$ file /lib/i38...

weixin_28730665的博客 123

STM32F407中文手册

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

[译]在Linux上用GCC创建共享库(Shared libraries with GCC on Linux)

英文原文:http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html 库是程序员必须的工具,它是已经编译过的代码。库通常提供通用的功能,例如链表和二叉树等数据结构,或者特定的功能,例如MySQL等数据库服务器访问接口。 多数大型软件项目有多个部件组成,这些部件有可能在其它项目中用到...

weixin_30632089的博客 273

Linux静态库和共享库

一、库的基本概念 1、库 Linux下编译生成一个可执行文件时,需要将这个可执行文件需要的函数目标文件包含进去。对于一个较大的工程来说可能有很多的函数目标文件,这些目标文件可能会被其他工程或程序所调用,因此比较好的方法是将这些函数目标文件组合在一个单独的文档文件中,这就是库文件。 2、库的概念 库有两种形式:静态库和共享库。 (1)静态库的代码在编译时就已连接到开发人员开发的应用程序中。 (2)共...

年少不知曲中意,再听已是曲终人 470

linux创建函数库

用GCC创建函数库: 假设用户函数为myfun.c,要生成libmy.so,则使用: gcc -shared -fPIC -Wmyfun.c -o libmy.so 有关参数含义: -shared-------编译产生共享库 -fPIC---------在编译产生共享库时作一些优化,可以不加 -W------------输出警告信息,可以不加 -o------------设定输出文件

DEV_linux的专栏 711

Linux下共享库的创建和使用

共享库与静态库的区别在于,共享库只是在调用模块中嵌入调用代码的在库的相对位置的地址,当执行程序时,共享库会和程序一起加载到内存中,当执行到调用共享库中代码的指令时跳转到共享库中执行,执行完毕后在跳转回来。 相比于静态库占用空间小,方便更新(共享库发生变化后,程序不需要再次编译),但相比于静态库执行效率略低。 共享库以.so结尾,Linux下需要以lib开头 下面将以libmath.so来说明如何创...

weixin_43504629的博客 2532
上一篇: 文件访问权限规则
下一篇: 回校了
mindview
博客等级 码龄19年 7粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值