首页 > 系统相关 >Linux环境编程-库

Linux环境编程-库

时间:2023-09-09 09:33:37浏览次数:42  
标签:可执行文件 文件 gcc 配置文件 静态 编程 环境 Linux 共享

一、库:

库文件是目标文件的集合,可以被其他代码调用,把代码封装成库文件后方便使用、方便管理,安全性高、保密性强

静态库:

就是目标文件的集合,当调用静态库时,编译器会把静态库的所有的二进制指令拷贝到最后的可执行文件中

  • 优点:

    运行速度比共享库要快,运行时不需要依赖静态库文件。(它把通用功能模块的多个目标文件打包在一起,用到它的程序只需要在链接时指定这个库文件,链接器就会从这个库中抽取出用到的功能代码拷贝到目标程序中,而不需要每次都对这些通用功能代码重新编译。)

  • 缺点:

1、可执行文件相对较大,当静态库有修改后,所有使用了该静态库的可执行文件都需要重新编译

2、磁盘和内存空间占用大。静态库虽然加快了编译速度,提高了不同部门间的协作效率,但是在每个与静态库链接的程序中,都会保存一份引用到的通用功能代码的拷贝,而且在运行时,每一份拷贝都要占用相应的物理内存。

共享库:

就是带入口的可执行文件,当调用共享库时,调用语句处会记录该函数在共享库中的位置,并且共享库文件要与运行的可执行文件一起加载到内存中,当执行到调用共享库代码的语句时,就会跳转到共享库二进制指令的内存中执行执行完后会跳转回调用语句处,其次,每个共享库在物理内存中只有一份副本,多个应用会在各自的虚拟地址空间内映射这同一份可执行文件,因此可以节省可观的内存空间。

  • 优点:可执行文件相对较小,当共享库有修改,可执行文件不需要重新编译

  • 缺点:运行速度比静态库慢一些,运行时需要依赖于共享库文件

二、静态库 .a

制作静态库:

1、编译出目标文件

  gcc -c xxx.c ...      

2、打包目标文件生成静态库文件

ar -r libxxx.a a.o b.o c.o...       

使用静态库:

1、直接使用

gcc xxx.c libxxx.a        

2、指定库文件的位置

  gcc xxx.c -Lpath -lxxx      

-L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)

3、通过修改配置文件中的环境变量来指定库的查找路径

  • 打开系统配置文件:
  vim ~/.bashrc          
  • 在配置文件末尾添加:
export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)            
  • 保存退出并重新加载配置文件
source ~/.bashrc           
  • 使用静态库:
gcc xxx.c -lxxx           

三、共享库 .so

制作共享库:

1、编译生成目标文件

  gcc -fpic -c xxx.c      

-fpic 生成与位置无关的文件

2、生成共享库文件

 gcc -shared -fpic a.o b.o c.o ... -o libxxx.so      

使用共享库:

编译时:

1、直接使用

gcc xxx.c libxxx.so       

2、指定库文件的位置

gcc xxx.c -Lpath -lxxx       

-L指定库的路径 -l库名 指定要加载的库(库名不包括前缀lib 后缀.a .so)

3、通过修改配置文件中的环境变量来指定库的查找路径

  • 打开系统配置文件:
vim ~/.bashrc           
  • 在配置文件末尾添加:
export LIBRARY_PATH=$LIBRARY_PATH:新路径(绝对路径)           
  • 保存退出并重新加载配置文件
source ~/.bashrc            
  • 使用共享库:
gcc xxx.c -lxxx            

运行时:

运行时,系统会去默认指定的共享库加载路径进行加载共享库,一般通过修改配置文件的环境变量进行设置

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:共享库的加载路径

注意

1、如果指定路径下有同名的静态库文件、共享库文件,gcc编译器会默认优先加载共享库文件

如果想要优先使用同名静态库文件 增加 -static编译参数实现

2、对配置文件中的环境变量进行删除修改时,最好重启终端才生效

动态使用共享库:

作用:在代码中决定使用哪些共享库,编译时不需要指定,执行时还是需要依赖共享库

dlopen\dlerror\dlsym        

库文件相关辅助命令:

  • ldd 查看可执行文件依赖哪些共享库 ldd ./a.out

  • nm 查看目标文件、可执行文件、静态库、共享库文件的符号列表

  • strip 减肥 删除目标文件、可执行文件、静态库、共享库文件的符号列表

标签:可执行文件,文件,gcc,配置文件,静态,编程,环境,Linux,共享
From: https://www.cnblogs.com/ljf-0804/p/17688917.html

相关文章

  • Linux与Windows双系统,安装完linux后无法通过grub进入Windows的解决方法
    其中有提示,所以解决方案也非常明确Warning:os-proberwillnotbeexecutedtodetectotherbootablepartitions.SystemsonthemwillnotbeaddedtotheGRUBbootconfiguration.CheckGRUB_DISABLE_OS_PROBERdocumentationentry.可以参考:https://huaweicloud.cs......
  • 在 Linux 系统上安装主播软件
    捕获设置在顶层菜单中,我们选择“File”→“Settings”,然后我们选择“Output”来设置要生成的文件的选项。这里我们可以设置想要的音频和视频的比特率、新创建的文件的目标路径和文件格式。这上面还提供了粗略的质量设置。如果我们将顶部的输出模式从“Simple”更改为“A......
  • PHP7内核实现原理-基本环境和C基础
    编译安装PHP7.1.0下载7.1.0源码压缩包:www.php.net/releases/./configure--prefix=/Users/lisong/Documents/workspace/php-src/output--enable-fpm编译,报错:configure:error:Pleasespecifytheinstallprefixoficonvwith--with-iconv=iconv是个国际化扩展,暂时用......
  • linux开发环境配置
    1.jdk1.81.解压tar-zxvfjdk-8u381-linux-x64.tar.gz-C/usr/local/java2.环境配置##安装vimyum-yinstallvim##配置文件vim/etc/profileexportJAVA_HOME=/usr/local/java/jdk1.8.0_381exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:......
  • Lua03——开发环境搭建
    1安装开发插件在idea或vscode中安装lua的开发插件EmmyLua2创建工程在idea中创建一个新的工程工程的类型选择lua输入工程名及目标目录在工程结构的SDK中设置lua在本地安装目录在工程结构的modules中选择lua3编写第一个lua程序在工程下添加程序包,并创建lua程序文件,需要......
  • Linux系统文件夹权限以及shell外壳的理解
    文件是什么和文件权限的简单理解首先我们要知道对于Linux中的文件而言一个文件=属性+内容。并且对于一个操作系统的使用人员而言,一个文件具有三种权限,分别是可读,可写,可执行。并且操作系统对于每一个用户(除了root权限)对于一个文件而言会倍分成不同的组。对于文件的创建者而言,Linux......
  • 并行编程(二)Julia中的顺序和异步编程
    概述这节课的主要目标是开始使用Julia编程,实现并行算法,本次课程中,特别关注语言的部分(函数式和异步编程)。 学习目标运行Julia代码安装Julia软件包编写连续的Julia代码使用Julia的函数式编程功能使用Julia的异步编程功能 WhyJulia?与高性能计算相关的课程通常使用C、C......
  • AI 编程助手 Amazon CodeWhisperer 使用(持续更新中)
    文章作者:天博近期chatGPT非常火爆,试用一些公众号功能,及自己接入的chatGPT,写小作文能力一流,但是准确率很低,一直在搜寻可以在idea中使用,且非常丝滑的AI编程工具,前不久看到infoq推荐的AmazonCodeWhisperer,最近一周一直试用,感觉很赞,所以强烈推荐亚马逊云科技开发者社......
  • C++多线程编程:包括多线程打印ABC、线程池实现等等
    #include<iostream>#include<thread>#include<mutex>#include<condition_variable>std::condition_variablecond;std::mutexprint_mutex;intflag=0;voidprint_thread(intnum){for(inti=0;i<10;i++)//循环{......
  • 从零开始搭建EasyDarwin环境——linux系统开发环境nodejs的搭建
    EasyDarwin是目前比较热门的开源平台之一,上一篇我们给大家详细展示了搭建EasyDarwin环境前实现虚拟机Linux系统共享目录,本文我们将说明一下如何在Linux下搭建起nodejs环境。1.首先安装wgetyuminstall-ywget如果已经安装了可以跳过该步骤。2.下载nodejs最新的bin包可以在下载页......