本页内容包含了在Unix/Linux中用源码包编译的通用的结构

可能不仅仅适用于ffmpeg

为啥使用源码包编译

  • 编译源码可以扩展功能,
  • 实现相对于自己平台的最优化,
  • 还可以自定义的修改

概述

大部分源码包编译安装包含下面几个步骤:

  • 配置(./configure
  • 编译(make
  • 安装((sudo) make install

配置的过程就是找找编译时候需要的啥程序有没有安装上,然后配置安装路径和需要安装的组件,在安装包里会有这么一个配置脚本,解决了怎么安装的问题

配置完成后开始编译,这个过程生成需要的库文件和二进制程序,解决了安装啥的问题

安装过程就是将库文件和二进制程序安装到在配置时指定的文件夹,当然如果不需要修改路径,那在编译的文件夹下也是可以使用的

一般安装到/usr/local/中,但可能需要管理员权限

安装路径

在配置的时候可以使用configure --prefix=PREFIX来指定安装到哪里。这里的PREFIX一般是/usr/local/

一般有如下几种文件夹需要安装:

  • PREFIX/bin:包含了一般的程序;像ffmpeg,ffplay,ffprobe之类的
  • PREFIX/include:存放着一些头文件,在编译与链接到此库的应用程序时用得着;像libavutil/avstring.h, libavcodec/avcodec.h, libavformat/avformat.h之类的
  • PREFIX/lib:包含了编译生成的库文件;像libavutil, libavcodec, libavformat之类的
  • PREFIX/share:包含了多种多样的不和系统相关的组件,尤其是帮助文件或者实例

通过指定prefix可以自己规划安装的布局

安装到/usr/local/中时,不同的包也会安装到这个文件夹下面,一般来讲这样不有利于恢复安装

如果我们安装到一个像/opt/PROJECT/这样的文件中时,只需要从系统路径中删除这个路径就可以起到删除安装的作用,但这也需要我们在安装的时候把它添加到路径当中

环境变量

有几个系统变量也会影响安装。尤其是在指定了安装的prefix之后,就需要更新一些变量,是系统能够找到你的程序,不然在控制台上输入就会说你没有安装

使用env命令可以显示环境变量

其中对我们安装有影响的包括:

  • PATH:这个参数是一些用:分割的路径,什么作用呢?当我们在终端中输入一个命令之后,系统会在这些路径当中根据这个命令查找对应的程序。可以使用export PATH=/opt/PROJECT/:$PATH来添加路径
  • LD_LIBRARY_PATH:顾名思义,这个是库文件的PATH,也可是使用相同的方法来添加。但有时不使用它而是使用ldconfig(动态库管理命令)
  • CFLAGS:指定C编译器使用的flag,像:预处理指令如-IPREFIX/include,或编译标志。自定义的CFLAGS使用源码包指定的编译系统。有些编译系统允许指定配置选项-extra-cflags。
  • LDFLAGS:指定linker使用的指令,通常包括链接指令,如-LPREFIX/lib(用于查找自定义路径中安装的库)。自定义的LDFLAGS作用于源码包指定的编译系统。或者,许多编译系统允许指定configure选项-extra-ldflags。
  • PKG_CONFIG_PATH:包含一些使用:分割的路径。许多编译系统使用pkg-config来获取作用在特定的库中的CFLAGS/LDFLAGS,这些flags包含在这些路径中的pkg-config文件里。

安装到非常规的位置或者./configure依赖于其他的动态库、头文件或者工具时,都要更新上述变量

环境变量通常存放在profile文件中。例如:用户文件夹下的.profile或者/etc/profile。可以编辑这些文件永久改变环境变量,或者使用脚本或者终端修改。

导出环境变量到子进程,可以使用export命令。更多内容请查看帮助文档。

LD_LIBRARY_PATH 和 ldconfig

当你在链接一个依赖于其他的库的库文件时,它会在系统设置的路径下和一个自定义的路径列表中查找这个依赖的库文件。有些系统使用LD_LIBRARY_PATH制定这个路径列表。当然我们也可以自己用ldconfig工具设置绝对路径,其实它编辑了/etc/ld.so.conf文件

请注意,在某些系统上,出于安全原因,shell配置文件中定义的LD_LIBRARY_PATH变量被重置了。因此可能需要重新设置每个会话或每个脚本。

配置的要求和发布版

当配置一个包时,需要检测依赖的库和头文件是否存在。很多发行版会提供所欲要库文件的二进制安装包,这样你就不会全都从头编译安装了。

一般来讲,对于一个库,可能需要这个库包和相对应的开发包。库包之中仅包含库,开发包中包含依赖于这个库的其它包在编译时需要的各种文件,像头文件和其他文件啥的。Debian的发布系中开发包使用-dev后缀,在RedHat发布系中使用-devel后缀,在Arch Linux中库包不分开包含着这两个包。

例如,在Debian发布系中,如果你要使用--enable-libmp3lame参数配置ffmpeg以支持mp3的编解码,那你就需要安装libmp3lame-dev的包

你还需要确认系统提供的库包与配置源码包所需的版本是兼容的。当所需的库包版本比提供的要新,那可能需要使用源码安装新的版本

安装后故障排除

首先确认二进制文件,头文件和库是否都在要安装到的位置了。然后验证命令是否可以执行,使用which -a加命令的名字获取命令安装到路径。

为了避免冲突,要小心不要多次安装相同的包

来源

  1. GenericCompilationGuide

下一部分

  1. 扩展安装

ffmpeg源码编译安装(Compile ffmpeg with source) Part 1 : 通用部分的更多相关文章

  1. ffmpeg源码编译安装(Compile ffmpeg with source) Part 2 : 扩展安装

    在Ubuntu,Debian,Mint上编译ffmpeg 本文主要为在Ubuntu,Debian和Mint上编译安装ffmpeg和库文件以及一些扩展的编解码器.当然这与从源中安装无关. 请首先看一下通 ...

  2. ffmpeg源码编译环境搭建

    ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...

  3. linux源码编译安装OpenCV

    为了尽可能保证OpenCV的特性,使用OpenCV源码编译安装在linux上.先从安装其依赖项开始,以ubuntu 14.04.X为例讲解在Linux上源码编译安装OpenCV,其他linux版本可以 ...

  4. Ubuntu 17.04版本下,opencv进行源码编译安装

    本文主要针对Ubuntu 17.04版本下,opencv进行源码编译安装.开发环境主要针对python 对 openCV库的调用. 安装 gcc cmake 编译环境 sudo apt-get ins ...

  5. MySQL 源码编译安装

    脚本须知: 1. 该脚本目前只测试过mysql版本为5.6.x的源码,其他源码可以对本脚本稍作修改即可 2. 本脚本也可以使用wget mysql源码的方式进行,但考虑到后期提供源码的地址不可用,所以 ...

  6. Httpd服务进阶知识-LAMP源码编译安装

    Httpd服务进阶知识-LAMP源码编译安装 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道,动态资源交给fastcgi程序处理,静态资源依旧由httpd服务器处理  ...

  7. SSH/SSL 源码编译安装简易操作说明

    环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...

  8. 源码编译安装 MySQL 5.5.x 实践

    1.安装cmakeMySQL从5.5版本开始,通过./configure进行编译配置方式已经被取消,取而代之的是cmake工具.因此,我们首先要在系统中源码编译安装cmake工具. # wget ht ...

  9. 烂泥:mysql5.5数据库cmake源码编译安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...

随机推荐

  1. python学习Day9 内存管理

    复习 :文件处理 1. 操作文件的三步骤:-- 打开文件:此时该文件在硬盘的空间被操作系统持有 |  文件对象被应用程序持用 -- 操作文件:读写操作 -- 释放文件:释放操作系统对文件在硬盘间的持有 ...

  2. python flask 解决中文乱码

    response = make_response(output_string)response.headers['Content-Type'] = 'text/plain;charset=UTF-8' ...

  3. css,html备忘录

    1.background:url()#000 ;代表当图片不够充满容器时,用黑色填满. 2.height:inherit;继承父级元素的高度. 当子元素给了绝对定位,父元素不给相对定位,子元素也能适配 ...

  4. 第二次oo博客作业--多线程电梯

    这次的系列作业是写一个电梯调度,主要目的是让我们熟悉多线程. 第一次作业是一个傻瓜电梯的调度问题,要求也很简单,即每次接一个人就行了.我只用了两个线程,一个是输入线程,一个是电梯线程,输入线程负责从标 ...

  5. pycharm 配置svn

    1.找到本地svn.exe 2.配置svn路径 3.输入svn路径,然后会进行密码校验 问题 本地的TortoiseSVN在bin目录没有发现svn.exe 原因: 安装TortoiseSVN的时候 ...

  6. iframe登录超时跳转登录页面

    1.可以在登录页面加jQuery验证 $(function () { //判断一下当前是不是做顶层,如果不是,则做一下顶层页面重定向 if (window != top) { top.location ...

  7. webpack优化以及node版本

    最近做的这个项目webpack用的是1.X的版本,真的非常多的坑,然后最近在疯狂的做优化: 事情的起因是每次我npm run dev的时侯都需要5分钟+,这个速度真的是难以忍受,然后就尝试去做项目的优 ...

  8. Centos 7 配置邮件发送

    一.环境 系统:centos 7 sendmail:sendmail.x86_64 0:8.14.7-5.el7 mailx版本:mailx-12.5-19.el7.x86_64 二.软件安装: 1. ...

  9. TZOJ 2519 Regetni(N个点求三角形面积为整数总数)

    描述 Background Hello Earthling. We're from the planet Regetni and need your help to make lots of mone ...

  10. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...