-
2019-01-21 15:08:37
命令安装的库的命名一般是lib(库名)-dev
比如显示缺少zip.h文件,推断可能是少zip
命令:
sudo apt-get install libzip-dev
yum 命令类似
更多相关内容 -
Linux库文件使用与编译
2018-10-11 17:41:53Linux库文件 静态库 在Linux中,以.a为后缀,如libtest.a 直接拷贝函数到二进制映像文件 只需要运行二进制文件,可以直接运行 共享库 在Linux操作系统中,以libxxx.so.x.x为格式命名 可执行文件在开始运行时将...介绍在Linux下使用静态库、共享库、动态库的方法。
Linux库文件
- 静态库
- 在Linux中,以.a为后缀,如
libtest.a
- 直接拷贝函数到二进制映像文件
- 只需要运行二进制文件,可以直接运行
- 在Linux中,以.a为后缀,如
- 共享库
- 在Linux操作系统中,以
libxxx.so.x.x
为格式命名 - 可执行文件在开始运行时将函数从共享库文件中读出,从而间接引用
- 好处是,当函数接口没变,实现改变时,不需要再次编译
- 在Linux操作系统中,以
- 动态库
- 动态加载库在指定位置加载的函数库
- 可以减少内存开销
库函数基本路径
/lib
- 标准共享库和静态库
/usr/lib
- 标准共享库和静态库
/usr/local/lib
- 本地函数库
库文件搜索顺序
- 首先在“LD_LIBRARY_PATH”环境变量所设置的路径下查找(一般都没有给此环境变量赋值)
- 搜索动态装载器在/etc目录下的缓存文件/etc/ld.so.cache(此文件由命令ldconfig创建更新)。
ldd
命令–查看到某可执行程序共享库清单
创建静态库
-
libhello.c
为要构建的库文件源文件,libhello.h
为调用此库文件的头文件,usehello.c
为测试程序。 -
首先将所需要文件编译成目标文件
-
gcc -c libhello.c
-
-
使用
ar
命令创建静态库-
ar rc libhello.a libhello.o
-
-
编译运行
-
gcc -o usehello_static usehello.c libhello.a
-
-
创建共享库
-
首先将所需要的库编译成目标代码,这里生成与位置无关,可以在任何地址被链接和装载:
-
gcc -fPIC -Wall -g -c libhello.c
-
-
使用
-shared
来创建共享库-
gcc -g -shared -Wl,-soname,libhello.so.1.0 -o libhello.so.1.0 libhello.o
-
这里的
so.1.0
表示对应的完整版本号,具体可参考这里。
-
-
创建
soname
连接:-
ln -sf libhelloso.1.0 libhello.so
-
这里创建一个链接,只是为了方便以后版本更新时,只需要更改链接的路径,不改变编译代码
-
-
编译并连接引用库文件
-
gcc -Wall -g -c usehello -o usehello.o gcc -g -o usehello_dynamic usehello.o -L ./ -lhello //连接引用库文件
-
其中,
-L
表示搜索路径,./
表示搜索当前路径 -
-lhello
- 会自动在
-l
前变为lib
,加上.so
,变为libhello.so
- 会自动在
-
-
运行,需要添加当前目录
pwd
到环境变量中-
LD_LIBRARY_PATH=$(pwd) ./usehello_dynamic
-
-
如果希望在使用连接器时不使用
-Ldirectory
标识就可以查找到该库,则可以采用以下方式之一:- 把此库拷贝到/usr/lib或者/lib文件夹中,或者在此两个文件夹任意一个中创建一个到该库的快捷方式,并命名为libname.so。
- 如果库所在路径没有在/usr/lib和/lib文件夹下,需要将该路径添加到文件“/etc/ld.so.conf”中,每一行增加一个路径,完成以上设置后,然后运行ldconfig命令更新库信息。
动态库
-
在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是运行时加载。
-
有专门的一组API用于完成打开动态库,查找符号,处理出错,关闭动态库等功能。
- dlopen
- dlerror
- dlsym
- dlclose
-
使用示例
- 静态库
-
linux 库的依赖和链接的顺序
2016-02-25 19:11:36linux库的依赖和链接先后顺序今天在归档minigui时,发现一个奇怪的问题。minigui的静态库加minigui软键盘的静、动态库怎么编译都通不过。而minigui的动态库加minigui软键盘的静、动态库都可以编译通过。且minigui的动、静态库是一个版本编译出来的。其中minigui的软键盘库是依赖于minigui库。
#################################################
libminigui.a 和libmgi.so 编译通不过
libminigui.a和libmgui.a 编译通不过
libminigui.so和libmgi.so 编译通过
libminigui.so和libmgui.a 编译通过
郁闷好久,最后无意中发现了原因。
makefile中的链接顺序不对, 库的链接如下:-lminigui -lmgi。改为:-lmgi -lminigui
总结:当A库依赖于B库时,B库是用的静态库,则在编译的时候链接顺序应该是 -lA -lB
-
完美解决Linux环境编译ffmpeg库
2022-03-11 14:35:07项目功能实现需要在Linux下编译出可用的FFmpeg库。FFmpeg在编译过程中是需要链接其它三方库的,比如x265 x265等,否则可能会造成功能不全(如程序接口返回找不到H264编码器错误),影响使用。编译这种三方库其实理论...背景说明
项目功能实现需要在Linux下编译出可用的FFmpeg库。FFmpeg在编译过程中是需要链接其它三方库的,比如x265 x265等,否则可能会造成功能不全(如程序接口返回找不到H264编码器错误),影响使用。编译这种三方库其实理论简单,但是细节磨人,有时候没设置好就是会有些莫名其妙的问题。我这里也参考了如零声学院分享的文档,结合自己情况总结记录了份编译说明,亲测有效,使用稳定。甚至可以按步骤无脑复制shell执行,编译一路绿灯,快速得到完美的FFmpeg库。
编译
整体思路就是先把依赖的库如x264、x265等先配置好,这些库不是必须的,但是保证库功能完整性最好都配置好。接下来就是下载FFmpeg源码,和依赖库进行配置然后进行编译,编译完成库即可用了。当前环境是 ubuntu18 desktop + ffmpeg 4.2.1
注意
(1)所有操作以我的环境为准,但可以完全按以下步骤依次复制命令执行,因为我是在home目录是通用的,建议按照此方法。如果想使用自己的路径要注意修改命令参数,防止路径不同造成的错误
(2)部分库可能需要连接github,最好选择网络较好的机器上编译
(3)整个安装过程,基本就是复制命令执行,等待执行结束。。。循环。测试多台机器编译过程中均无报错,正常情况预计用时15分钟以内,即可完成全部编译工作一、创建目录
在home目录下创建
ffmpeg_sources:用于下载源文件
ffmpeg_build: 存储编译后的库文件
bin:存储二进制文件(ffmpeg,ffplay,ffprobe,X264,X265等)
命令:cd ~ mkdir ffmpeg_sources ffmpeg_build bin
二、安装依赖
更新软件信息
sudo apt-get update
安装需要的组件
sudo apt-get -y install \ autoconf \ automake \ build-essential \ cmake \ git-core \ libass-dev \ libfreetype6-dev \ libsdl2-dev \ libtool \ libva-dev \ libvdpau-dev \ libvorbis-dev \ libxcb1-dev \ libxcb-shm0-dev \ libxcb-xfixes0-dev \ pkg-config \ texinfo \ wget \ zlib1g-dev
三、安装三方库
安装一些最常见的第三方库,默认均以源码方式安装。安装库所需的命令如下
NASM
部分库使用到汇编程序。
使用源码进行安装cd ~/ffmpeg_sources && \ wget https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/nasm-2.14.02.tar.bz2 && \ tar xjvf nasm-2.14.02.tar.bz2 && \ cd nasm-2.14.02 && \ ./autogen.sh && \ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && \ make && \ make install
Yasm
部分库使用到该汇编库
使用源码进行安装:cd ~/ffmpeg_sources && \ wget -O yasm-1.3.0.tar.gz https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz && \ tar xzvf yasm-1.3.0.tar.gz && \ cd yasm-1.3.0 && \ ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && \ make && \ make install
libx264
H.264视频编码器。更多信息和使用范例参考H.264 Encoding Guide
要求编译ffmpeg时配置:–enable-gpl --enable-libx264.
使用源码进行编译:cd ~/ffmpeg_sources && \ git -C x264 pull 2> /dev/null || git clone --depth 1 https://gitee.com/mirrors_addons/x264.git && \ cd x264 && \ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-pic && \ PATH="$HOME/bin:$PATH" make && \ make install
libx265
H.265/HEVC 视频编码器, 更多信息和使用范例参考H.265 Encoding Guide。
要求编译ffmpeg时配置:–enable-gpl --enable-libx265.
使用源码进行编译:sudo apt-get install mercurial libnuma-dev && \ cd ~/ffmpeg_sources && \ if cd x265 2> /dev/null; then git pull && cd ..; else git clone https://gitee.com/mirrors_videolan/x265.git; fi && \ cd x265/build/linux && \ PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off ../../source && \ PATH="$HOME/bin:$PATH" make && \ make install
libvpx
VP8/VP9视频编解码器。 更多信息和使用范例参考VP9 Video Encoding Guide 。
要求编译ffmpeg时配置: --enable-libvpx.
使用源码进行编译:cd ~/ffmpeg_sources && \ git -C libvpx pull 2> /dev/null || git clone --depth 1 https://github.com/webmproject/libvpx.git && \ cd libvpx && \ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm --enable-pic && \ PATH="$HOME/bin:$PATH" make && \ make install
libfdk-aac
AAC音频编码器. 更多信息和使用范例参考AAC Audio Encoding Guide。
要求编译ffmpeg时配置:–enable-libfdk-aac ( 如果你已经配置了 --enable-gpl则需要加上–enable-nonfree).
使用源码进行编译:cd ~/ffmpeg_sources && \ git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac && \ cd fdk-aac && \ autoreconf -fiv && \ ./configure CFLAGS=-fPIC --prefix="$HOME/ffmpeg_build" && \ make && \ make install
libmp3lame
MP3音频编码器.
要求编译ffmpeg时配置:–enable-libmp3lame.
使用源码进行编译:cd ~/ffmpeg_sources && \ git clone --depth 1 https://gitee.com/hqiu/lame.git && \ cd lame && \ PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-nasm --with-pic && \ PATH="$HOME/bin:$PATH" make && \ make install
libopus
Opus音频编解码器.
要求编译ffmpeg时配置:–enable-libopus.
使用源码进行编译:cd ~/ffmpeg_sources && \ git -C opus pull 2> /dev/null || git clone --depth 1 https://github.com/xiph/opus.git && \ cd opus && \ ./autogen.sh && \ ./configure --prefix="$HOME/ffmpeg_build" -with-pic&& \ make && \ make install
四、安装FFmpeg
到这里常见的三方库默认已经都装好了,唠叨下,上面的库可以不全安装,但是为了库的功能全面性,还是别偷懒,毕竟编译好,可以一直用。下面下载FFmpeg源码和上面的库联合编译,此过程相对用时久一些,耐心等待
cd ~/ffmpeg_sources && \ wget -O ffmpeg-4.2.1.tar.bz2 https://ffmpeg.org/releases/ffmpeg-4.2.1.tar.bz2 && \ tar xjvf ffmpeg-4.2.1.tar.bz2 && \ cd ffmpeg-4.2.1 && \ PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" CFLAGS="-O3 -fPIC" ./configure \ --prefix="$HOME/ffmpeg_build" \ --pkg-config-flags="--static" \ --extra-cflags="-I$HOME/ffmpeg_build/include" \ --extra-ldflags="-L$HOME/ffmpeg_build/lib" \ --extra-libs="-lpthread -lm" \ --bindir="$HOME/bin" \ --enable-gpl \ --enable-libass \ --enable-libfdk-aac \ --enable-libfreetype \ --enable-libmp3lame \ --enable-libopus \ --enable-libvorbis \ --enable-libvpx \ --enable-libx264 \ --enable-libx265 \ --enable-pic \ --enable-shared \ --enable-nonfree && \ PATH="$HOME/bin:$PATH" make && \ make install && \ hash -r
五、安装完成
到此,整个编译就完成了。可以去看下最初创建的那三个文件夹,我们最感兴趣的是ffmpeg_build,如下图。
include: 里面是各种头文件,用来加入到业务项目中引用
lib: 便是心心念的库,里面有静态的还有动态的,按自己需求使用
还有像ffmpeg ffplay ffprobe等可执行程序,在以上三个文件夹内可以找到,具体位置不在说明。要说明一点是,这里只是编译出来纯粹的库文件,可以保证库的质量,但具体的使用需自行配置。 -
Linux快速查找库文件位置
2020-09-10 16:14:42ldconfig -p | grep lib_name ldconfig -p 会打印出当前系统已经安装的动态库信息,然后使用grep找你的lib即可 -
Linux中的库(Library)
2018-08-25 16:28:06一、库文件 库是一组预先编译好的函数的集合,这些函数都...在Linux中,标准的库文件一般存放在/lib和usr/lib的目录中。c语言编译器gcc(更确切的说是链接程序)需要知道要搜索哪些库文件,因为默认情况下,它只搜... -
linux下查看库是否存在
2018-11-30 16:04:17在做Linux开发的时候,往往会出现 某些库 can not found 的情况,在我们添加了这些库之后,如何查看这些库的路径是否被识别了呢?下面介绍一个命令: ldconfig -p | grep lts 说明:使用 ldconfig -p 命令用来... -
linux下添加库的加载路径
2019-08-09 12:43:291.修改环境变量 export LD_LIBRARY_PATH=path_name 2.修改配置文件 修改/etc/ld.so.conf的内容在最后添加库加载的新的路径,然后执行:ldconfig 使配置生效。 -
怎么查看linux库是使用哪个版本的编译器编译的
2013-05-13 17:29:24由于对同样的库的源码 有的使用4.1.2编译器编译的 有的是4.1.1等等,结果导致有时候存放的时候忘记了写版本信息,导致要重新编译。 解决方法: objdump -s --section=.comment your_program 查看程序编译器... -
linux下链接库文件默认搜索路径
2019-12-04 20:28:16库文件包含静态库文件和动态库文件。 静态库就是在链接的时候加入到执行代码中,成为了代码的一部分,所以生成的可执行文件就比较大,以后和静态库没瓜葛了,自己随便用了;...一般 Linux 系统把 /lib ... -
linux静态库 动态库 去符号 符号恢复
2018-04-17 00:45:08前言 最近遇到了一题去除符号的题目,需要进行符号修复。为此学习了一波,顺便补了补其它的一下知识。 准备知识 命名方式: ...动态库libxxx.so.major.minor .so .dll 静态库:libxxx.a .a ....生成静态库 ar cqs l... -
Linux系统中添加库文件路径的方法
2017-02-23 16:44:13一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。但是,对于处于默认库搜索路径之外的库,就需要将库的位置添加到库的搜索路径... -
Linux查看库依赖方法
2018-04-27 11:54:441.查看依赖的库:objdump -x xxx.so | grep NEEDED2.查看可执行程序依赖的库:objdump -x 可执行程序名 | grep NEEDED3.查看缺少的库:ldd xxx.so如果某个依赖的库不存在,会打印类似“xxx.so not found”的提示。..... -
Linux动态库环境变量设置
2018-06-30 15:46:26永久生效的环境变量设置,编辑/...动态库环境变量设置: LD_LIBRARY_PATH= folder : $LD_LIBRARY_PATH export LD_LIBRARY_PATH folder指的是动态库文件夹所在位置。例如,.so等文件在:/home/lib/下,则folder就是... -
Linux查看某个库是否安装
2017-08-03 16:39:34$ ldconfig -p | grep pcap 说明: ldconfig -p:打印当前缓存所保存的...“ldconfig主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如li -
Linux安装字体库
2022-03-16 11:57:39由于生成图片的方法中用到了微软黑体,部署到服务器后显示乱码。安装字体库即可 安装前: 安装后: 1. 在Linux上安装字体库 ...在Linux的/usr/share/fonts下新建一个chinese目录,将windows上的字体库全部拷. -
解决Linux系统下使用yum命令“无法启用仓库”的错误
2020-04-30 09:57:33解决Linux系统下使用yum命令“无法启用仓库”的错误 这个问题困扰我好久,查了很多资料也没解决。最后茅塞顿开了,我们一般部署虚拟机是安装Ubuntu的,但Ubuntu下不支持使用yum命令,所以,你只需: 把: “yum -y ... -
Linux:查看动态库/程序依赖的库
2022-03-12 14:36:05# 查看依赖的库 objdump -x xxx.so | grep NEEDED # 查看可执行程序依赖的库 objdump -x ./testTime | grep NEEDED readelf命令 # 查看依赖的库 readelf -a xxx.so | grep "Shared" # 查看可执行程序依赖的库 ... -
Linux学习笔记(十一) -- Opencv库的编译和安装
2018-07-03 17:52:00OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言... -
linux库文件的搜索方法,以及交叉编译的库搜索方法
2012-07-15 23:10:09一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中。... -
QT - Linux下动态库&静态库的创建及使用指南
2020-04-25 11:59:30本文介绍了Linux下Qt、动态库、静态链接库的创建以及使用的两种方法(显示链接及隐式链接),分享了在使用显示链接中遇到的坑及解决办法,希望能帮到大家。 -
linux下查看程序依赖的库
2021-05-12 02:42:03在x86下,为了查看程序所依赖的库,可使用linux 但若是是使用arm-linux-gcc 等交叉编译环境编译出来的程序,则要使用web 库用于将类似函数打包在一个单元中。而后这些单元就可为其余开发人员所共享,并所以有了模块化... -
Linux 编译cpp为动态库so文件
2019-01-07 10:54:50g++ hash.cpp -fPIC -shared -o hash.so -
java jna linux导入so动态库及参数对应问题
2018-06-13 19:39:28载入库文件有两个函数,System.load 和 System....当使用System.loadlibrary时是在系统的library 的目录中需找复合条件的库文件,可以使用-Djava.library.path=[path]参数,来指定Java程序加载库文件的... -
查看linux库文件32位还是64位
2014-09-25 09:46:11objdump -a *.a objdump -a *.so -
Windows和Linux上生成动态库(dll,.so)
2019-06-27 12:13:07二、Linux相对简单一点 1、同样是先编写头文件以及对应的源文件。 2、g++ -fPIC -shared -o libOnvifSnapShot.so(动态库名字) OnvifSnapShot.cpp(生成动态库所需要的源文件) 已生成。 3、... -
Visual Studio – 借助远程Linux服务器环境在Visual Studio中编写和远程调试Linux C++程序
2022-03-14 15:26:391.1 安装使用C++的Linux开发的工具集 首先需要在Visual Studio Installer中安装使用C++的linux开发的工具集 等待使用C++的Linux开发的工具集安装完成,并重启Visual Studio。 1.2 准备可远程的Linux服务器以及在... -
linux动态库修改名称(修改库文件内容)
2020-08-13 00:40:29在linux系统下,当系统中存在多个相同命名的动态库(.so)时,ldconfig只为执行程序链接最后找到的库,而之后找到的库虽然通过“ifconfig -p”可以看到库路径信息,但不会被链接到执行程序。 在实际编程中,... -
linux_MIB 库 MIB标准
2010-10-08 14:42:41linux_MIB 库 MIB标准 -
跨平台的socket库,windows-linux-socket
2015-06-10 11:45:00跨平台的socket库,windows-linux-socket