【Linux】如何打包成动静态库,第三方动静态库如何使用?

这篇具有很好参考价值的文章主要介绍了【Linux】如何打包成动静态库,第三方动静态库如何使用?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


库的名称:去掉前面的 lib 去掉后面的 .a(版本号) .so(版本号) 剩下的,才是库正真的名称。

查看文件依赖库:ldd


1. 打包成静态库

ar -rc [lib库的名称.a] [需要打包的.o文件]

r : replace (更新替换)

c:create (建立)


2. 打包成动态库(共享库)

  1. 使用 gcc -fPIC 创建 .o 文件
  • (PIC)position ignoring code 与位置无关码
gcc -fPIC -c [.c文件]
  1. gcc -shared 打包 .o 文件
  • -shared 共享库 / 动态库
gcc -shared -o [lib动态库名.so] [需要打包的.o文件]

3. 使用第三方静态库

当我们有了一个库,接下来,要将库引入我们的项目,必须要让编译器找到 库 和 头文件

  • 需要指定的 头文件 和 库文件
  • 如果没有默认安装到系统 gcc、g++ 默认的搜索路径下,用户必须指明对应的选项,告知编译器:
    • 头文件在哪里
    • 库文件在哪里
    • 库文件具体是谁
  • 如果我们下载下来的库和头文件,拷贝到系统默认路径下,就叫做,在 Linux 下安装库
  • 如果我们安装的库是第三方的(语言、操作系统系统接口就是第一方和第二方)库,我们要正要使用,即使是全部都安装到了系统中,gcc 和 g++ 都必须使用 -l 来指明具体库的名称
gcc -o mytest main.c -I[头文件的路径] -L[库的路径] -l[去头尾的库名]

-L:后接 的路径(可以用 . ..),可以带空格也可以不带空格,
-I:后接 头文件 的路径(可以用 . ..),可以带空格也可以不带空格,
-l:后接 链接的 库名(去头去尾),可以带空格也可以不带空格

注意:静态链接形成的可执行程序,本身就有静态库中对方法的实现。 也就是说使用静态链接注定 会占用更多的资源。占用哪些资源呢?磁盘、可执行程序体积变大加载占用内存、下载周期变长、占用网络资源


4. 使用第三方动态库

使用静态库的方法,让我们把路径和名称给了编译器,OS 可以通过链接原则,即,将用户使用的二进制代码直接拷贝到目标可执行程序中。

但动态库不是这样的。还需要将 .so 文件放到系统的默认路径下,才能被 OS 找到。

运行时,OS 查到动态库的方法:

  1. 环境变量:向 LD_LIBRARY_PATH 中添加库所在的路径
    这是一个临时方案,此方法重启机器就无效了

  2. /lib64//user/lib64 下创建第三方库的 软链接

sudo ln -s [被链接路径] /lib64/[库名]
  1. 在系统路径 /etc/ld.so.conf.d/添加配置文件,写入 第三方库的路径
# 1. 在对应系统路径下添加一个配置文件
sudo touch /etc/ld.so.conf.d/[myconf.conf]

# 2. 将第三方库的所在位置,添加到文件中
sudo vim /etc/ld.so.conf.d/[myconf.conf]

# 3. 让 ld 路径下的系统配置文件生效
sudo ldconfig

5. 动态库的加载

只要我们把库加载到了内存,映射到进程的地址空间(共享区)中之后,我们的代码执行库中的方法时,就依旧还是在自己的地址空间内进行函数跳转即可。

不管有多少进程,动态库只会加载一份,是很节省资源的。

库中的地址,怎么理解?

动态库必定面临一个问题:
不同的进程,运行程度不同,需要使用的第三库是不同的,注定了,每一个进程的共享区中空闲的位置是不确定的。动态库中的地址,是不能确定的,所以使用库时绝对不能使用绝对地址。

动态库中的所有地址都是偏移量,默认从 0 开始。

当一个库,真正的被映射进地址空间的时候,它的起始地址才能真正确定。所以我们调用动态库的时候,选取地址的方法是:该进制中这个库真正的起始地址 + 调用方法的偏移量。如此一来,库就可以在进程的地址空间中随便加载,与我们具体加载到地址空间的什么位置就毫无关系了。

6. 注意事项

  1. 动态库和静态库同时存在时,系统默认采用动态链接

需要连接静态则,需要给出参数 -static

gcc -o mytest main.c -I[头文件的路径] -L[库的路径] -l[去头尾的库名] -static
  1. 编译器,在链接的时候,如果提供的库既有动态又有静态,优先采用动态链接。如果只有静态的话,直接静态链接。

  2. 静态的库删了不影响可执行程序运行,而动态的少了就不能跑了。

  3. 云服务器一般只有动态库,静态库需要自己安装

c 的静态库

sudo yum install -y glibc-static

c++ 的静态库文章来源地址https://www.toymoban.com/news/detail-634893.html

sudo yum install -y libstdc++-static

到了这里,关于【Linux】如何打包成动静态库,第三方动静态库如何使用?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Day31:安全开发-JS应用&WebPack打包器&第三方库JQuery&安装使用&安全检测

    Day31:安全开发-JS应用&WebPack打包器&第三方库JQuery&安装使用&安全检测

    目录 打包器-WebPack-使用安全 第三方库-JQuery-使用安全 思维导图 JS知识点: 功能:登录验证,文件操作, SQL 操作,云应用接入,框架开发,打包器使用等 技术:原生开发, DOM ,常见库使用,框架开发( Vue , NodeJS ),打包器 ( Webpack ) 等 安全:原生开发安全, NodeJS 安全,

    2024年03月14日
    浏览(21)
  • android使用fat-aar打包,本地aar和第三方依赖库以及遇到的问题

    android使用fat-aar打包,本地aar和第三方依赖库以及遇到的问题

    需要把有个模块打包成aar,直接打包的话,模块中引用的jar、aar、第三方依赖库都不会打包进去。直接生成的aar缺少内部引用的以来,所以要用到fat-aar来把模块中用到的依赖也打包进去。 1.首先在项目的gradle加入 2.在repositories加入 3. 在需要打包aar的build.gradle中加入 4.第三方

    2024年02月15日
    浏览(10)
  • 如何使用第三方API采集电商数据呢?

    如何使用第三方API采集电商数据呢?

    电商商家最常唠叨的就是店铺运营难做。每日多平台店铺数据统计汇总繁琐耗时,人工效率偏低,且工作内容有限。 特别是眼下“618,双十一,双十二,年底大促”将至,如何提高运营的效率和质量、保证产品及服务的良性运作,是电商企业急需解决的难题。 01 数据,电商

    2024年02月20日
    浏览(18)
  • maven打包抽离第三方jar

    maven打包抽离第三方jar

    gitee地址:ruoyi-pom-config: 用来修改ruoyi-cloud的pom文件示例,第三方jar包抽取打包 以若依微服务项目为说明示例,需要用git下载下来结合理解,后端项目结构 图一:  红圈一的pom为最父级的pom文件 最父级 pom文件内容如下  先重点看最父级pom文件,下面图中的红圈部分 图二:

    2024年02月20日
    浏览(17)
  • 如何使用ADB Sideload 线刷第三方ROM

    如何使用ADB Sideload 线刷第三方ROM

    任何刷机和root的前提都是解锁bl。现在国内只有小米和一加手机支持解锁bl后还有手机质保,而小米除了出厂HyperOS的手机外解锁起来都较为简单,只是需要等待罢了。 关于MIUI14及以下的系统如何解锁bootloader,其实非常简单。在开发者选项中的设备解锁状态页面中绑定后等待

    2024年04月26日
    浏览(8)
  • 【Maven】maven引入第三方jar包并打包

    【Maven】maven引入第三方jar包并打包

    idea中的springboot项目引用第三方jar包,打包时将其引入 本文参照官网:http://maven.apache.org/ 第一种:在pom文件引入jar包的目录 1.选择File下的project Structure 2.选择Module,选择项目模块,选择Dependencies下的加号:点击JARs or Directories…: 3.选择你jar包所在的位置,点击OK,点击Apply,此时已

    2024年02月16日
    浏览(12)
  • 安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计&WebPack打包器&第三方库JQuery&安装使用&安全检测

    安全开发-JS应用&NodeJS指南&原型链污染&Express框架&功能实现&审计&WebPack打包器&第三方库JQuery&安装使用&安全检测

    Node.js是运行在服务端的JavaScript 文档参考:https://www.w3cschool.cn/nodejs/ Nodejs安装:https://nodejs.org/en 三方库安装 express:Express是一个简洁而灵活的node.js Web应用框架 body-parser:node.js中间件,用于处理 JSON, Raw, Text和URL编码的数据。 cookie-parser:这就是一个解析Cookie的工具。通过re

    2024年02月11日
    浏览(33)
  • idea 创建java项目,引入第三方jar,打包jar包

    idea 创建java项目,引入第三方jar,打包jar包

    前提:已安装好JDK,并且配置好了JDK环境变量。 直接点击create创建即可 刚创建完的项目可能是没有out目录的,当我们执行一次main方法,代码会经过编译,然后生成out目录 打印输出结果,我们第一个java Hello word 就执行完啦。 创建Java文件和包 下载jar包的网站:https://mvnrepos

    2024年02月11日
    浏览(17)
  • springboot引入第三方jar包本地lib并打包 亲测可用

    一、在项目根目录创建lib目录并放入第三方lib包 : 二、pom中引入第三方lib system表示依赖不是由maven仓库,而是本地的jar包 ${pom.basedir}/lib/commons-io-2.6.jar指向jar包位置即可 ${pom.basedir}表示项目根目录 三、将第三方lib也打入jar包

    2024年01月25日
    浏览(16)
  • Jupyter(CPP内核) || 如何在使用xeus-cling时添加第三方库

    国内的搬运真是管杀不管埋。在CSDN上找了半天没有找到在xeus-cling添加第三方库的,最后还是只能自己到处去看英文文档。 先贴上英文文档的链接:Introduction — xeus-cling documentation 构建二进制文件时,通常在构建工具中指定包含目录和第三方库的库路径。库将在二进制执行时

    2024年02月15日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包